背景
初学者对性能分析是个《横看成岭侧成峰,远近高低各不同。不识庐山真面目,只缘身在此山中。》那么应该怎么学习才能建立起自己的知识体系,才能做到《千山同一月,万户尽皆春。千江有水千江月,万里无云万里天》今天咱们谈谈7DGroup创始人高楼老师的性能分析之决策树分析法。
分析决策树图一
当物理内存不够时,linux 触发oom,将进程杀掉;可以使用vmstat可以展现给定时间间隔的服务器的状态值,包括Linux的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况,用于分析磁盘的压力在哪里,在swap,还是在load文件等
想深入了解内存工作原理可以查找资料继续学习与深造。
分析决策树图二
在分析CPU的时候咱们需要了解下,CPU可以做什么事情:
- First, it can be idle, which means that the processor is not actually doing any work and is waiting for something to do.
- Second, the CPU can be running user code, which is specified as "user" time.
- Third, the CPU can be executing code in the Linux kernel on behalf of the application code. This is "system" time.
- Fourth, the CPU can be executing user code that has been "nice"ed or set to run at a lower priority than normal processes.
- Fifth, the CPU can be in iowait, which mean the system is spending its time waiting for I/O (such as disk or network) to complete.
- Sixth, the CPU can be in irq state, which means it is in high-priority kernel code handling a hardware interrupt.
- Finally, the CPU can be in softirq mode, which means it is executing kernel code that was also triggered by an interrupt, but it is running at a lower priority (the bottom-half code).
If a system is spending most of its time iowait when it should be doing work, it is most likely waiting for I/O from a device. It may be a disk, network card, or something else causing the slowdown.
分析决策树图二
在学习Linux disk I/O 先聊下磁盘系统结构:
- 如果是IDE驱动器,磁盘命名为:hda、hdb、hdc等;
- 如果是SCSI驱动器,磁盘命名为:sda、sdb、sdc等
磁盘通常被分成多个分区,分区设备的名称是通过将分区号添加到基本设备名称的末尾来创建的,每个单独的分区通常包含一个文件系统或一个交换分区,按照/etc/fstab中的指定,这些分区被装载到Linux根文件系统中。这些挂载的文件系统包含应用程序读写的文件。
当应用程序执行读或写操作时,Linux内核可能会将文件的副本存储在其缓存或缓冲区中,并在不访问磁盘的情况下返回所请求的信息。但是,如果Linux内核没有存储在内存中的数据副本,它会向磁盘的I/O队列添加一个请求。如果Linux内核注意到多个请求请求磁盘上的连续位置,它会将它们合并为一个大请求。这种合并消除了第二个请求的寻道时间,从而提高了总体磁盘性能。当请求被放入磁盘队列时,如果磁盘当前不忙,它将开始为I/O请求提供服务。如果磁盘正忙,请求将在队列中等待,直到驱动器可用,然后对其进行服务。
分析工具:
vmstat [-D] [-d] [-p partition]
-d:显示磁盘相关统计信息。
-D: 显示Linux I/O子系统的总统计信息,统计数据是自系统启动以来的总数
- p: 统计数据是自系统启动以来的总数,而不仅仅是此示例和上一个示例之间发生的总数。
使用vmstat 中关于磁盘也就是 bo/bi/wa
bo 这表示在前一间隔内写入磁盘的块总数。(在vmstat中,磁盘的块大小通常为1024字节。)
bi 显示在上一间隔中从磁盘读取的块数。(在vmstat中,磁盘的块大小通常为1024字节。)
wa 表示等待I/O完成所花费的CPU时间。每秒写入磁盘块的速率
分析决策树图三
参考命令:hostname, ping, ifconfig, iwconfig, netstat, nslookup, traceroute, finger, telnet, ethtool
在学习网络层这一层需要了解下网络的七层协议:
图片来自互联网
作为一名未来的全栈工程师,还是有必要了解每一层做什么,这样在解决性能问题能如鱼得水,如果想深入学习可以参加高老师课程,老师可以把大家讲明白。
命令:
ip -s [-s] link
sar [-n DEV | EDEV | SOCK | FULL ] [DEVICE] [interval] [count]
ip -s link
简单解释:
- bytes 发送或接收的字节总数。
- packets 发送或接收的数据包总数。
- errors 发送或接收时发生的错误数。
- dropped 由于网卡资源不足而未发送或接收的数据包数。
- overruns 网络没有足够缓冲空间发送或接收更多数据包的次数。
- mcast 已接收的多播数据包数。
- carrier 由于链路媒体故障(如电缆故障)而丢弃的数据包数。
- collsns 这是设备在传输时遇到的冲突数。当两台设备试图同时使用网络时,就会发生这种情况。
sar -n DEV 1 2
sar -n SOCK 1 2
具体什么意思大家可以百度查询
也可使用命令:yum install iptraf
执行:iptraf-ng -d eth0 -t 1 就能看到相关信息
通过 iptraf-ng -s eth0 -t 10 命令就知道那个端口进出流量是多少
netstat
[-p] [-c] [–interfaces=<name>] [-s] [-t] [-u] [-w]
netstat -t -c
netstat -t -p
netstat -s -u
还有很多用法,大家可以参看帮助文档
第一层是业务指标,
- 响应时间
- TPS
- 错误率
第二层是操作系统
- CPU
- IO
- MEM
- NET
分析
在这一层咱们主要关注MEM ,既然是关注MEN,如果MEN高应该怎么去分析?怎么定位?
linux命令 free
说明:
- total:总计物理内存的大小。
- used:已使用多大。
- free:可用有多少。
- Shared:多个进程共享的内存总额。
- Buffers/cached:磁盘缓存的大小。
In addition to the CPU statistics vmstat can provide, you can invoke vmstat with the following command-line options when investigating memory statistics:
复习观察Linux 内存信息命令
vmstat [-a] [-s] [-m] [-d] [-p] [n] [-f] [-v]
解释
- -a:显示活跃和非活跃内存
- -f:显示从系统启动至今的fork数量 。
- -m:显示slabinfo
- -n:只在开始时显示一次各字段名称。
- -s:显示内存相关统计信息及多种系统活动数量。
- delay:刷新时间间隔。如果不指定,只显示一条结果。
- count:刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。
- -d:显示磁盘相关统计信息。
- -p:显示指定磁盘分区统计信息
- -S:使用指定单位显示。参数有 k 、K 、m 、M ,分别代表1000、1024、1000000、1048576字节(byte)。默认单位为K(1024 bytes)
- -V:显示vmstat版本信息。
下面具体每个信息代表什么,大家百度查下,知识需要不断重复学习才能记住,网上有很多,只是把知识搬运过来,给大复习。
vmstat -m 显示的信息与cat /proc/slabinfo显示的信息相同
This describes in detail how the kernel's memory is allocated and can be helpful to determine what area of the kernel is consuming the most memory.
意思就是说:通过这个命令就能知道内存在那个区域消耗最多。
在学一个命令:vmstat -s
以上信息可以:准确跟踪内核如何使用其内存时非常有用
top
这一行可以观察出来内存情况
如果想进一步学习可以参考《Optimizing Linux Performance .chm》
总结
想做好一件事,需要很多个知识点,但很多知识点需要不断学习、复习与思考才能在关键的时候用,上面知识相信大家都知道,但是否在关键的时候想起使用那个命令解决问题,如果没有想起,那么该知识点还是没有掌握与融汇贯通。