Linux性能优化--性能追踪3:系统级迟缓(prelink)
12.0 概述
本章包含的例子说明了如何用Linux性能工具寻找并修复影响整个系统而不是某个应用程序的性能问题。阅读本章后,你将能够:
- 追踪是哪一个进程导致了系统速度的降低。
- 用strace调查一个不受CPU限制的进程的性能表现。
- 用strace调查一个应用程序是如何与Linux内核进行交互的。
- 提交描述性能问题的bug报告,以便创作者或维护者有足够的信息修改该问题。
12.1调查系统级迟缓
本章我们调查系统级迟缓。首先会发现系统行为逐渐变慢,我们将用Linux性能工具找到确切的原因。这种类型的问题经常发生。作为一个用户或系统管理员,有时你可能会注意到Linux机器变得缓慢,或者需要很长时间才能完成任务。能够弄清楚机器变缓的原因是很有价值的。
12.2确定问题
和前面一样,第一个步骤是准确找出我们要调查的问题。本例中,在使用Fedora Core 2桌面系统的条件下,我们将调查发生的周期性迟缓问题。通常情况下,桌面系统性能良好,但偶尔磁盘会开始不停地读盘,其结果就是菜单和应用程序打开的时间非常长。过一会儿,磁盘研磨消退,而桌面系统行为又恢复正常。本章我们将弄清楚究竟是什么导致了这个问题,以及其发生的原因。
这个问题的类型与前两章的问题都不一样,因为一开始我们完全不知道系统的哪部分引发了问题。而在调查GIMP和nautilus的性能时,我们是知道应由哪个应用程序对问题负责的。在这种情况下,我们只有一个表现不佳的系统,理论上来说,性能问题可能存在于系统的任何部分。这种情况也是常见的。当遇到它时,重要的是用性能工具去实际追踪问题的原因,而不是仅仅去猜测原因并尝试解决方案。
12.3找到基线/设置目标
还是和前面一样,第一步是确定问题的当前状态。
不过,对本例来说,这一点不容易做到。我们不知道问题什么时候发生或者它会持续多长时间,因此在没有进一步调查前,我们无法真正地设置基线。至于说到目标,理想状态下,我们希望问题完全消失,但是导致问题出现的可能是重要的OS功能,因此,可能无法完全消除它。
首先,针对问题为什么会出现我们需要多做一点调查,以便找到一个合理的基线。第一步是在迟缓发生时运行top。这会给我们提供一个可能导致问题的进程列表,或者甚至也可能直指内核自身。
在这种情况下,如清单12.1所示,运行top并要求它只显示非空闲进程(top运行时按<>)。
清单12.1中的top输出有几个有意思的特性。第一,我们注意到没有进程占用CPU,两个非空闲任务使用的CPU时间都不到2%。第二,系统花费了91%的时间等待I/O的发生。第三,系统没有使用任何交换空间,因此磨盘不是由交换导致的。最后,有一个未知进程prelink在问题发生时正在运行。由于不清楚这个prelink命令是什么,因此我们先记住应用的名字,之后再调查它。
我们的下一步是运行vmstat,看看系统做了什么。清单12.2给出了vmstat的结果,并确认了我们在top中看到的。也就是,大约90%的系统时间用于等待I/O。该清单还告诉我们磁盘子系统读数据的速度大概是1000块/秒。这个磁盘I/O量相当大。
现在我们知道磁盘被频繁使用,内核花费了很多时间等待I/O和未知应用程序prelink 的运行,我们可以开始弄清楚系统究竟在干嘛。
我们不能确认prelink是导致问题的原因,但是我们怀疑它是。明确prelink是否引起磁盘I/O的最简单方法就是“杀死”prelink进程,看看磁盘的使用是不是消失了。(这在生产用计算机上是不可能的,不过我们使用的是个人桌面系统,所以可以快一点儿,不那么严格。)清单12.3显示了vmstat的输出,在其中一半的地方,我们终止了prelink进程。如你所见,prelink被终止后,块读取降为零。
由于prelink看着像是事由应用程序,现在可以开始调查它到底是什么,以及它为什么运行。清单12.4请求rpm告诉我们哪些文件是prelink构成包的组成部分。
首先,我们注意到prelink包有一个日常运行的作业cron。这解释了为什么性能问题的发生是周期性的。其次,我们注意到prelink包含了描述其功能的手册页和文档。手册页将prelink描述为可以预链接可执行文件与库的应用程序,以此减少它们的启动时间。(有点讽刺意味的是,用于提高性能的应用程序正在拉低系统的速度。)prelink有两种运行模式。第一种模式使得所有指定的可执行文件和库都预链接,即使之前已经完成预链接了。(用–force或-f选项指定)。第二种是快速模式,prelink只需查看库与可执行文件的mtime与ctime,看看从上次预链接后是否发生了变化。(用–quick或-q选项指定。)通常,prelink会把已预链接的可执行文件的所有mtime和ctime写入它自己的缓存。然后在快速模式中使用这些信息,以避免对已经预链接过的可执行文件再执行预链接。
检查prelink包中的cron条目显示,默认情况下,Fedora系统同时使用了prelink的两种模式。每隔14天用完整模式调用prelink。而在此期间的每一天,prelink运行于快速模式。
对完整模式和快速模式下的prelink进行计时可以告诉我们最糟糕的情况有多慢(全预链接),以及使用快速模式后性能提升了多少。对prelink计时要小心,因为不同的运行可能会产生完全不同的时间。如果运行的应用程序使用了大量的磁盘I/O,就必须让它多运行几次以便获得对其基准性能的精确指示。磁盘密集型应用程序第一次运行时,许多数据从它的I/O加载到缓存。程序第二次运行时,其性能就会好很多,因为要使用的数据已经在缓存中了,不再需要从磁盘读取。如果用第一次运行作为基线,你会被误导,以为调整后性能就提升了,但其实提升的真正原因是预热了缓存。只有多运行应用程序几次,你才可以预热好缓存,获得准确的基线。清单12.5显示了运行多次后,两种模式下prelink 的结果。
清单12.5中首先要注意的事实是快速模式与完整模式相比,并没有都快得那么多。这点值得怀疑,需要更多的调查。第二点事实强调了top的报告。prelink只占用了一点CPU 时间,其余的全都用来等待磁盘I/O。
现在我们必须选择一个合理的目标。安装在prelink包中的PDF文件描述了预链接的过程。它也说明了完整模式需要花费几分钟,而快速模式需要花费几秒钟。作为目标,让我们试着把快速模式的时间减少到一分钟之内。即使我们可以优化快速模式,每隔14天仍然会遇到明显的磨盘,但是日常运行会有更多的改善。
12.4为性能追踪配置应用程序
调查的下一步是为性能追踪配置应用程序。prelink是一个小而独立的应用程序。事实上,它甚至不使用任何共享库。(它是静态链接的。)不过比较好的做法是,用全部的符号对其进行重编译,这样需要的时候就可以在调试器(gdb)中查看它。同样,这个工具用configure命令产生生成文件。我们必须下载源代码到prelink,并用符号对它重新编译。我们可以从Red Hat再次下载prelink的源rpm。源代码被安装在/usr/src/redhat/SOURCES 下。一旦解压了prelink的源代码后,就可以如清单12.6所示对其进行编译。
12.5安装和配置性能工具
追踪的下一步是安装性能工具。本例中,无论是ltrace还是oprofile都派不上用场。oprofile用于剖析使用了大量CPU时间的应用程序,而prelink在运行时只使用了3%的CPU时间,所以oprofile对我们没有帮助。而prelink二进制文件是静态链接的,且不使用任何共享库,所以1trace也帮不上我们。不过,系统调用追踪器strace可能会有帮助,因此我们需要安装它。
12.6运行应用程序和性能工具
现在,我们终于可以开始分析prelink在不同模式下的性能特征了。正如你刚才看到的,prelink没有花很多时间使用CPU,相反,它把所有的时间都花在磁盘I/O上了。prelink必须调用内核进行磁盘I/O,因此我们用性能工具strace应该能追踪它的执行。prelink的快速模式没有表现得比标准完整运行模式快很多,所以我们用strace比较这两个运行,看看是否有任何可疑行为出现。
首先,我们要求strace追踪较慢的完整运行prelink。该运行创建了初始缓存,它将在prelink运行于快速模式时使用。起初,我们让strace显示prelink的系统调用汇总,看看其中的每一个要花多长时间完成。实现该操作的命令如清单12.7所示。
清单12.7还是prelink输出的一个样本。在尝试预链接一些系统可执行文件和库时,prelink显得有些吃力。这个信息在后面会变得很有价值,所以要记住它。
清单12.8显示了由清单12.7中的strace命令生成的输出汇总文件。
如同清单12.8所示,相当多的时间花在了系统调用read上。这是免不了的,prelink需要找出哪些共享库被链接到了应用程序,这就要把部分可执行文件读入并进行分析。prelink 文档表明,当生成应用程序所需库的列表时,该程序实际上是由动态加载器用特殊模式启动的,之后用通道从可执行文件中读取信息。这就是为什么在分析中pread也很高的原因。与之相反,我们希望快速版本中这样的调用会很少。
要查看快速版本的分析有何不同,我们在prelink的快速模式下运行同样的strace命令。实现该操作的strace命令如清单12.9所示。
清单12.10显示了运行于快速模式的prelink的strace分析信息。
和预期的一样,清单12.10表明快速模式执行了大量的lstat64系统调用。这些系统调用返回每个可执行文件的mtime和ctime。prelink在其缓存中查找,并把保存的mtime和ctime与可执行文件当前的mtime和ctime进行比较。如果可执行文件发生了变化,就对其启动prelink;如果没有变化,则继续下一个可执行文件。实际上prelink大量调用lstat64是个好现象,这就表示prelink的缓存正在工作。不过,prelink仍然大量调用read就不太好了。缓存应该记住已预链接的可执行文件,但不应试图分析它们。我们必须弄明白为什么prelink在尝试分析它们。最简单的方法就是以正常模式运行strace。strace将显示prelink 发起的全部系统调用,并有希望澄清哪些文件被读取,以及解释为什么read被调用得如此频繁。清单12.11显示的是strace对快速prelink使用的命令。
strace的输出是一个14MB的文本文件aq_run。浏览后发现prelink用lstat64检查了许多库和可执行文件。但是,它也揭示了使用read()的几种不同情况。如清单12.12所示,首先prelink读取一个shell脚本。由于shell脚本不是二进制ELF文件,因此它不能被预链接。
这些shell脚本从最初的完整系统prelink开始运行起就没有改变过,所以如果prelink 的缓存能记录该文件不能被预链接的事实就好了。如果ctime和mtime不变,prelink甚至都不会去尝试读取它们。(如果是上一个完整预链接中的shell脚本,且我们还没有碰过,它还是不能预链接。)
其次,在清单12.13中,我们观察到prelink试图操作一个静态链接的应用程序。该应用程序不依赖于任何共享库,因此试图对它进行预链接是没有意义的。prelink的初始运行应该抓住一个事实,即这个应用程序不能被预链接,并将该信息保存到prelink的缓存中。在快速模式下,甚至不应该去尝试预链接这个二进制文件。
最后,在清单12.14中,我们看到prelink在读取一个二进制文件,该文件在最初的完整系统运行时存在预链接故障。在初始prelink输出中,我们看到了关于这个二进制文件的错误。当开始读取该文件时,它会捕捉其他库,并操作其中的每一个库及其依赖项。这会触发大量的读取。
对这种情况进行优化有些复杂。因为该二进制文件不是真正的问题(而是它链接的库libxpcom.so),我们不能只是在缓存中将该可执行文件标记为坏。但是,如果我们将错误库的名称libxpcom.so与失败的可执行文件一起保存,它可能会检查该二进制文件与库的时间,只有当其中的一个发生变化,才会尝试再次预链接。
12.7模拟解决方案
strace揭示的信息显示,prelink花了大量的时间试图打开并分析它可能无法预链接的二进制文件。测试缓存不可预链接的二进制文件是否能改善prelink的性能的最好方法是修改prelink,将所有这些不可预链接的二进制文件都添加到prelink的初始缓存中。可惜的是,添加代码来缓存这些“不可预链接的”二进制文件会是一个复杂的过程,其中涉及大量的有关prelink应用程序的内部知识。更简单的方法是模拟缓存,将所有的不可预链接的二进制文件替换为已知的可预链接的二进制文件。这会导致运行快速模式时忽略之前全部的不可预链接二进制文件。若我们有一个工作缓存,这正是会发生的,因此,如果prelink能够缓存并忽略不可预链接的二进制文件,可以用它来评估我们将看到的性能提升。
开始实验,我们把/usr/bin/中的所有文件都复制到sandbox目录下,并在这个目录上运行prelink。这个目录包含了正常二进制文件、shell脚本和其他不能被预链接的库。然后在sandbox目录上运行prelink,并告诉它创建一个新缓存,而不是用系统缓存。如清单12.15 所示。
接着,在清单12.16中,我们对快速模式的prelink运行了多久进行计时。需要多次运行,直到给出的结果达到一致。(第一次运行是为随后的每一次运行进行缓存热身。)清单12.16中的基线时间为0.983秒。为了显示我们的优化(改善缓存)调查是值得的,必须击败这个时间。
然后,在清单12.17中,我们在这个prelink命令上运行strace,记录prelink在sandbox目录中打开了哪些文件。
接着我们创建一个新目录sandbox2,我们再次将/usr/bin/中的所有二进制文件都复制到这个目录下。但是,我们用一个已知的好的、能被预链接的二进制文件覆盖了在之前strace输出中prelink“打开的”所有文件。我们把这个文件复制到全部的有问题的二进制文件,而不仅仅是删除它们,所以两个sandbox所含的文件数相同。建立第二个sandbox后,我们用清单12.18中的命令在这个新目录上运行完整版prelink。
最后,对快速模式的运行计时,并将其与我们的基线进行比较。
同样的,这也需要运行多次,第一次运行也是缓存热身。清单12.19中,我们可以看到我们所做的,事实上,能看到性能的提升。执行prelink的时间从约0.98秒下降到约0.29秒。
接着,我们比较两次不同运行的strace输出,确认进行读取的次数,实际上,这个次数减少了。清单12.20显示了sandbox的strace汇总信息,其中包含了prelink不能链接的二进制文件。
清单12.21显示了sandbox的strace汇总信息,其中prelink可以链接所有的二进制文件。
如同你从清单12.20和清单12.21的不同中发现的一样,我们已经显著减少了目录中读取的次数。同时,我们还已经大大减少了预链接该目录所需的时间。缓存和回避不可预链接的可执行文件看起来是一种有前途的优化方法。
12.8 报告问题
我们已经发现了问题,并在系统软件相当低的层次上找到了可能的解决方案,因此,与作者一起解决这个问题是一个好主意。我们至少要提交一个bug报告以便作者知道这个问题的存在。提交用于发现问题的测试也有助于作者重现问题并增加修复问题的希望。本例中,我们将向Red Hat的bugzilla(bugzilla.redhat.com)追踪系统添加一个bug报告。(大多数其他发行版也有相似的bug追踪系统。)我们的bug报告描述了我们遇到的问题以及发现的可能的解决方案。
在bugzilla中,我们首先搜索prelink的bug报告,看看是否已经有其他人提交了关于该问题的报告。本例中,没有人提交相关报告,因此我们输入如清单12.22所示的bug报告,等待作者或维护者的回复,或者问题修复。
即便作者或维护者从未回复,把问题输入到bug追踪数据库仍旧是个好主意。问题及其可能的解决方案将被记录下来,某些热心的程序员也许会继续探索并修复该问题。
12.9测试解决方案
由于我们还没有解决prelink代码中的问题,而是提交了bug报告,因此我们不能立即以原始基线为参照测试被修复的prelink时间。不过,如果作者或维护者能够实现提交的变化,或者甚至是找到了更好的方法进行优化,我们将能在更新版本出现时检查其性能。
12.10本章小结
本章中,我们从一个表现不佳的系统开始,用性能工具找出哪个子系统被过度使用(如vmstat所示的磁盘子系统),以及哪个组件导致了问题(prelink)。接着调查prelink应用程序确定了它为什么有这么多的磁盘I/O(用strace)。我们在prelink的文档中发现缓存模式可以大大减少磁盘I/O。研究了缓存模式的性能之后,我们发现它消除的磁盘I/O并不如预期那样多,其原因是它试图对不能预链接的文件进行预链接。之后,我们模拟了一个缓存,避免对不可预链接的文件尝试进行预链接,以此证明它明显减少了磁盘I/O的数量以及快速模式下prelink的运行时间。最后,我们向prelink的作者提交了bug报告,希望该作者能意识到问题并修复它。本章是Linux性能追踪的最后一章。
在下一章,也就是本书最后一章,我们将从更高层次来看看Linux的性能和性能工具。我们将回顾本书介绍的方法和工具,并考虑一些已成熟并可改进的Linux性能工具领域。
相关文章:
![](https://img-blog.csdnimg.cn/12b9d1f9d07f4036b0055ef48b5805cf.png)
Linux性能优化--性能追踪3:系统级迟缓(prelink)
12.0 概述 本章包含的例子说明了如何用Linux性能工具寻找并修复影响整个系统而不是某个应用程序的性能问题。阅读本章后,你将能够: 追踪是哪一个进程导致了系统速度的降低。用strace调查一个不受CPU限制的进程的性能表现。用strace调查一个应用程序是如…...
![](https://img-blog.csdnimg.cn/6b5c94724bd94d33ab4c310e3bd32f19.png#pic_center)
SpringBoot2.x简单集成Flowable
环境和版本 window10 java1.8 mysql8 flowable6 springboot 2.7.6 配置 使用IDEA创建一个SpringBoot项目 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.…...
![](https://img-blog.csdnimg.cn/aa6d07a916e64b82af72581f97f7c84e.png)
微信小程序一键获取位置
需求 有个表单需要一键获取对应位置 并显示出来效果如下: 点击一键获取获取对应位置 显示在 picker 默认选中 前端 代码如下: <view class"box_7 {{ showChange1? change-style: }}"><view class"box_11"><view class"…...
![](https://img-blog.csdnimg.cn/a399c55e4b7549078dd8ab3117e3bc09.png)
Linux性能优化--使用性能工具发现问题
9.0 概述 本章主要介绍综合运用之前提出的性能工具来缩小性能问题产生原因的范围。阅读本章后,你将能够: 启动行为异常的系统,使用Linux性能工具追踪行为异常的内核函数或应用程序。启动行为异常的应用程序,使用Linux性能工具追…...
![](https://img-blog.csdnimg.cn/71e4a3eb956044cf99e667f5ca6a8354.png)
【Proteus仿真】【STM32单片机】路灯控制系统
文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真STM32单片机控制器,使用LCD1602显示模块、人体红外传感器、光线检测模块、路灯继电器控制等。 主要功能: 系统运行后,LCD1602显示时间、工作模…...
![](https://img-blog.csdnimg.cn/fa0c26aad8164f718a8ab56213c1d0e2.png)
Flutter笔记:发布一个Flutter头像模块 easy_avatar
Flutter笔记 发布一个头像Flutter模块 easy_avatar 作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263 邮箱 :291148484163.com 本文地址:https://blog.csdn.net/qq_28550263/article/details/1339…...
![](https://img-blog.csdnimg.cn/9463a906287940f5b84a23232b6f1e6b.png)
标准化助推开源发展丨九州未来参编开源领域4项团体标准正式发布
在数字中国及数字经济时代的大背景下,开源逐步成为各行业数字化发展的关键模式。在开源产业迅速发展的同时,如何评估、规范开源治理成为行业极度关注的问题。 近日,中电标2023年第27号团体标准公告正式发布,九州未来作为起草单位…...
![](https://img-blog.csdnimg.cn/img_convert/98fe73d0d8943105c273a07d620e344a.png)
ChatGPT对于留学生论文写作有哪些帮助?
2022年11月,OpenAI公司的智能聊天产品ChatGPT横空出世,并两个月之内吸引了超过1亿用户,打破了TikTok(抖音国际版)9个月用户破亿的纪录。 划时代的浪潮 ChatGPT的火爆立即引起了全球关注并成为热门话题,它…...
![](https://img-blog.csdnimg.cn/009ae31184b542cb8cf5e256af42d0e1.png)
【yolov8目标检测】使用yolov8训练自己的数据集
目录 准备数据集 python安装yolov8 配置yaml 从0开始训练 从预训练模型开始训练 准备数据集 首先得准备好数据集,你的数据集至少包含images和labels,严格来说你的images应该包含训练集train、验证集val和测试集test,不过为了简单说…...
![](https://img-blog.csdnimg.cn/b8039b9b770f427bbec95798368f1711.png)
【vue+nestjs】gitee第三方授权登录【超详细】
项目场景: 前端使用vue3ts 后端使用nestjs 1.配置gitee第三方设置 1.找到账号设置 2.找到数据管理下的第三方应用 3.点击创建,进入配置 2.代码演示 特别注意: 如果你跟我一样是前后端分离的模式开发的,应用回调地址填写的应该是你的前…...
![](https://www.ngui.cc/images/no-images.jpg)
node 第八天 使用前后端不分离的方式实现cookie登录验证
实现cookie登录, 第一次登录成功后, cookie由服务端设置并保存在客户端, 后续访问在cookie过期前 (过期时间由后端设置) 将不需要登录cookie出现的背景是 HTTP是无连接的,无状态的, 半双工(http2.0以下), 所以需要一个媒介存在http中, 服务端可以操作, 客户端也可以…...
![](https://img-blog.csdnimg.cn/019b90f9b4a64a4fadd0f5f09a7ce86b.png)
Ubuntu系统如何进行网络连接-连接电脑局域网-物联网开发-Ubuntu系统维护
一、前言 在Ubuntu系统的维护中,我们常常需要对VMware中的Ubuntu虚拟机配置网络连接,以连接服务器下载或安装软件包以及进行网络通信等。 基于上述问题,本文将着重分享Ubuntu配置网络链接的若干方法。 二、网络连接模式 打开VM,右…...
![](https://img-blog.csdnimg.cn/84e4f302e57d484db21cb6e391517ed1.png)
STL库——Vector常见使用接口
一、介绍 1. vector是表示可变大小数组的序列容器,就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的࿰…...
![](https://www.ngui.cc/images/no-images.jpg)
将文件(File 对象)分割成多个块
如果要将文件(File 对象)分割成多个块,可以使用 JavaScript 中的 Blob 和 File 构造函数以及数组的 slice 方法。以下是一个示例: // 创建一个 File 对象,例如从文件输入框获取的文件 const file document.getElemen…...
![](https://img-blog.csdnimg.cn/a6bce12ee70440c0b7344fcb7881e11e.png)
若要对多态类进行深拷贝,应使用虚函数的clone,而不是公开的拷贝构造赋值
拷贝一个多态类可能会导致切片问题,为了解决这个问题,应覆盖一个虚clone函数,让他根据实际类型进行复制并返回一个到新对象的所有权的指针(std::unique_ptr),在派生类,通过使用所谓的协变返回类型来返回派生…...
![](https://www.ngui.cc/images/no-images.jpg)
同构字符串(C++解法)
题目 给定两个字符串 s 和 t ,判断它们是否是同构的。 如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上…...
![](https://img-blog.csdnimg.cn/5af251f7c39f4ddf9472e6a0411d9b1b.png)
『Linux升级路』基本指令
🔥博客主页:小王又困了 📚系列专栏:Linux 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、认识操作系统 📒1.1什么是操作系统 📒1.2操作系统…...
![](https://img-blog.csdnimg.cn/fe8d4f67d8c548c7a9f7f162bcb49726.png)
python argparse解析参数
用法比较简单,直接看代码 import argparseargparser argparse.ArgumentParser(descriptionthis is a hello argparser program) argparser.add_argument(--arg1, -a, typestr, helparg1 has value) argparser.add_argument(--arg2, typestr, default"value2&q…...
![](https://img-blog.csdnimg.cn/b235c1f23cb245f9853bed296b5ee79c.png)
【数据挖掘】数据挖掘、关联分析、分类预测、决策树、聚类、类神经网络与罗吉斯回归
目录 一、简介二、关于数据挖掘的经典故事和案例2.1 正在影响中国管理的10大技术2.2 从数字中能够得到什么?2.3 一个网络流传的笑话(转述)2.4 啤酒与尿布2.5 网上书店关联销售的案例2.6 数据挖掘在企业中的应用2.7 交叉销售 三、数据挖掘入门3.1 什么激发了数据挖掘…...
![](https://img-blog.csdnimg.cn/125cce5b939749b5877cda29ff8a576a.bmp)
nodejs+vue 学生宿舍管理系统设计与实现
可将教师信息、宿管信息、学生信息、楼栋信息等输入到系统中。只有管理员才能录入相关的资料,按照提示,输入相应的资料,而“导入”则可以通过上传档案,导入成功后,相应的寝室就会相应的减少。在录入大楼的时候…...
![](https://www.ngui.cc/images/no-images.jpg)
汽车R155法规包含那些国家?
标签:R155法规国; R155强制标准;R155;UCNECE; R155是由联合国欧洲经济委员会(UNECE)的世界汽车行业论坛(WP.29)发布的法规,专门针对汽车的网络安全。因为它是…...
![](https://www.ngui.cc/images/no-images.jpg)
一个简易的低代码
前言 最近接手了一个低代码平台可视化大屏做二次开发,在这里做一些记录。 低代码平台简介:低代码平台是一种开发工具,它可以让开发人员使用简单的拖拽和配置来创建应用程序,而不需要编写大量的代码。低代码平台通常包括一个可视化…...
![](https://img-blog.csdnimg.cn/img_convert/b16a8e688a6b6471bf6f9031d5498d2a.png)
【JVM系列】- 类加载子系统与加载过程
类加载子系统与加载过程 😄生命不息,写作不止 🔥 继续踏上学习之路,学之分享笔记 👊 总有一天我也能像各位大佬一样 🏆 博客首页 怒放吧德德 To记录领地 🌝分享学习心得,欢迎指正…...
![](https://img-blog.csdnimg.cn/img_convert/150016e4fc52de855ed54a8858e29927.png)
Amazon图片下载器:利用Scrapy库完成图像下载任务
概述 本文介绍了如何使用Python的Scrapy库编写一个简单的爬虫程序,实现从Amazon网站下载商品图片的功能。Scrapy是一个强大的爬虫框架,提供了许多方便的特性,如选择器、管道、中间件、代理等。本文将重点介绍如何使用Scrapy的图片管道和代理…...
![](https://img-blog.csdnimg.cn/415f52c017a449d180cfed407d4acf95.gif)
Unity中Shader的Pass的复用
文章目录 前言一、怎么实现Pass的复用1、给需要引用的Pass给定特定的名字2、在需要引用 Pass 的Shader中,在Pass的平行位置使用 UsePass "ShaderPath PassName" 二、实现一个没被遮挡的部分显示模型原本的样子,遮挡部分显示模型的XRay效果1、…...
![](https://www.ngui.cc/images/no-images.jpg)
vue内容自适应方法
Vue中可以通过以下几种方式实现内容自适应: 使用CSS媒体查询:使用CSS媒体查询可以根据屏幕大小来动态改变元素的样式。例如,可以设置一个div元素在屏幕宽度小于600px时宽度为100%,在屏幕宽度大于600px时宽度为50%。 使用Vue的计算…...
![](https://www.ngui.cc/images/no-images.jpg)
RustDay05------Exercise[41-50]
41.使用模块的函数 mod 是用于创建模块的关键字。模块是一种组织代码的方式,它可以包含函数 (fn)、结构体 (struct)、枚举 (enum)、常量 (const)、其他模块 (mod) 等。模块用于组织和封装代码,帮助将代码分割成可管理的单元。模块可以形成层次结构&…...
![](https://img-blog.csdnimg.cn/c8150c4fee064fe28ff01cb6aa8ead5d.png)
C语言实现通讯录(超详细)
1.实现怎样一个通讯录 实现一个通讯录联系人信息:1.可以保存100个人的信息名字2.添加联系人年龄3.删除指定联系人性别4.查找指定联系人电话5.修改指定联系人住址6.排序联系人7.显示所有联系人信息 2.通讯录的实现 2.1创建两个源文件和一个头文件 首先我们创建con…...
![](https://www.ngui.cc/images/no-images.jpg)
【Python机器学习】零基础掌握MinCovDet协方差估计
如何更精准地评估资产的风险和收益? 在投资领域,资产的风险和收益评估是至关重要的。传统的协方差矩阵虽然在某种程度上能反映资产间的关联性,但也存在一定的局限性。例如如果样本数量较少,传统的协方差矩阵可能会出现偏差,从而影响投资决策。 假设现在有一个投资组合,…...
![](https://img-blog.csdnimg.cn/img_convert/8f6313da708eba3ae27c80ae541a5431.jpeg)
2023年【四川省安全员A证】模拟试题及四川省安全员A证作业模拟考试
题库来源:安全生产模拟考试一点通公众号小程序 2023年四川省安全员A证模拟试题为正在备考四川省安全员A证操作证的学员准备的理论考试专题,每个月更新的四川省安全员A证作业模拟考试祝您顺利通过四川省安全员A证考试。 1、【多选题】36V照明适用的场所条…...
![](https://img2018.cnblogs.com/blog/1500098/201811/1500098-20181120211219907-1006231841.jpg)
企业网站建设基本流程/培训方案模板
昨天:导出到excel代码的编写 今天:绘制折线图的代码的预编写 遇到的问题:不会绘制折线图代码的编 明天:绘制折线图的代码的编写和完善 转载于:https://www.cnblogs.com/4EY4EVER/p/9991632.html...
![](/images/no-images.jpg)
做游戏排行榜的网站模板/怎么在网上销售
本文实例讲述了Python实现的拟合二元一次函数功能。分享给大家供大家参考,具体如下:背景:使用scipy拟合一元二次函数。参考:HYRY Studio-《用Python做科学计算》代码:# -*- coding:utf-8 -*-#! python3import numpy as…...
![](https://img-blog.csdnimg.cn/df65e8ce226f495db33dca07113cb306.png)
镇江海绵城市建设官方网站/站长工具查询seo
主要是编写shell代码部分问题: 注:for i相当于for i in $* (取全部位置参数)下文存在不在赘述 4.对教材例题4.9 (P108)进行编辑,然后执行。 #!/bin/bash echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9 shift echo $0 $1 $2 $3 $4 $5 $6 $7 $8 $9 shift 4 echo …...
![](/images/no-images.jpg)
最火的二十个电商app/广州网络推广seo
这里总结了常见的一些mysql错误,会不断更新。 要求大家将如下错误的每个单词都知道是什么意思,方便调错。 --1.语法错误:SQL syntax [Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL …...
![](https://img-blog.csdnimg.cn/img_convert/da826159514b19e503bfe1aea1a779a0.png)
wordpress后台地址能改/灰色关键词排名优化
https://codeforces.com/contest/1698/problem/A 标签 位运算 题意 给定 n - 1 个数, 让 x 等于这 n - 1 个数依次 按位异或 的结果, 即 x a[1] ^ a[2] ^a[3] ^ … ^ a[n - 1]. 现在将 x 放入这 n - 1 个数中并打乱, 找出哪个数是 x. 若有多个 x, 输出任意一个. 思路 …...
![](https://img-blog.csdnimg.cn/img_convert/ae2a50939a0b9834df360db6fe3f9e06.png)
乳山市工程建设交易网站/东莞今日头条最新消息
如何利用R语言进行meta分析—详细教程(2)--(如何在meta分析中进行离群值检测与meta回归)小伙伴们大家好,在我上一篇的推文里详细讲解了如何利用R语言的meta包并以OR值和 95%CI作为效应尺度进行合并作meta分析的文章&am…...