linux有诸多优秀的工具帮助我们分析服务器各项性能指标和协助开发调试工作。下面只列举比较基础的命令,且一般是集成在linux环境中而不需再次安装的命令。更多更详细的命令可以参考 https://github.com/brendangregg/perf-tools
A
、CPU进程相关 常用工具列举下:uptime、ps、top、mpstat、pidstat等
uptime: 查看系统运行时间,平均负载等。
ps:可查看某个进程占用CPU资源百分比;查看线程信息
ps -eLf
top/htop/atop:显示的信息同ps接近,但是top可以了解到CPU消耗,可以根据用户指定的时间来更新显示;
top -Hp pid(主线程id) 可以看到多线程程序中所有线程的状态。
mpstat: 可以查看所有CPU的平均信息,还能查看指定CPU的信息;
pidstat: 对于显示某个进程的状态,耗费时间等非常有用。
可通过以下命令查看缺页中断信息
ps -o majflt,minflt -C <program_name>
ps -o majflt,minflt -p <pid>
其中, majflt 代表 major fault ,指大错误, minflt 代表 minor fault ,指小错误。这两个数值表示一个进程自启动以来所发生的缺页中断的次数。其中 majflt 与 minflt 的不同是, majflt 表示需要读写磁盘,可能是内存对应页面在磁盘中需要 load 到物理内存中,也可能是此时物理内存不足,需要淘汰部分物理页面至磁盘中。
例如,下面是 mysqld 的一个例子。
mysql@ XX_590_591:~> ps -o majflt,minflt -C mysqld
MAJFLT MINFLT
144856 15296294
如果进程的内核态 CPU 使用过多,其中一个原因就可能是单位时间的缺页中断次数多个,可通过以上命令来查看。
如果 MAJFLT 过大,很可能是内存不足。
如果 MINFLT 过大,很可能是频繁分配 / 释放大块内存 (128k) , malloc 使用 mmap 来分配。对于这种情况,可通过 mallopt(M_MMAP_THRESHOLD, <SIZE>) 增大临界值,或程序实现内存池。
ps -o majflt,minflt -C <program_name>
ps -o majflt,minflt -p <pid>
其中, majflt 代表 major fault ,指大错误, minflt 代表 minor fault ,指小错误。这两个数值表示一个进程自启动以来所发生的缺页中断的次数。其中 majflt 与 minflt 的不同是, majflt 表示需要读写磁盘,可能是内存对应页面在磁盘中需要 load 到物理内存中,也可能是此时物理内存不足,需要淘汰部分物理页面至磁盘中。
例如,下面是 mysqld 的一个例子。
mysql@ XX_590_591:~> ps -o majflt,minflt -C mysqld
MAJFLT MINFLT
144856 15296294
如果进程的内核态 CPU 使用过多,其中一个原因就可能是单位时间的缺页中断次数多个,可通过以上命令来查看。
如果 MAJFLT 过大,很可能是内存不足。
如果 MINFLT 过大,很可能是频繁分配 / 释放大块内存 (128k) , malloc 使用 mmap 来分配。对于这种情况,可通过 mallopt(M_MMAP_THRESHOLD, <SIZE>) 增大临界值,或程序实现内存池。
B、内存相关 常用工具:free、vmstat
free:可查看内存的总数、已使用、空闲内存数,swap使用(当系统没有足够物理内存来应付所有请求的时候就会用到swap设备,swap设备可以是一个文件,也可以是一个磁盘分区。不过要小心的是,使用swap的代价非常大。如果系统没有物理内存可用,就会频繁swapping,如果swap设备和程序正要访问的数据在同一个文件系统上,那会碰到严重的IO问题,最终导致整个系统迟缓,甚至崩溃)情况等,特别提醒,如果swap使用较多,说明服务器内存不怎么够用了;
Linux系统内存中的cache(free 输出中的cached)并不是在所有情况下都能被释放当做空闲空间用的,即使可以释放cache,也并不是对系统来说没有成本的。总结一下要点,我们应该记得这样几点:
1).当cache作为文件缓存被释放的时候会引发IO变高,这是cache加快文件访问速度所要付出的成本。
2).tmpfs中存储的文件会占用cache空间,除非文件删除否则这个cache不会被自动释放。
3).使用shmget方式申请的共享内存会占用cache空间,除非共享内存被ipcrm或者使用shmctl去IPC_RMID,否则相关的cache空间都不会被自动释放。
4).使用mmap方法申请的MAP_SHARED标志的内存会占用cache空间,除非进程将这段内存munmap,否则相关的cache空间都不会被自动释放。
5).实际上shmget、mmap的共享内存,在内核层都是通过tmpfs实现的,tmpfs实现的存储用的都是cache。
2).tmpfs中存储的文件会占用cache空间,除非文件删除否则这个cache不会被自动释放。
3).使用shmget方式申请的共享内存会占用cache空间,除非共享内存被ipcrm或者使用shmctl去IPC_RMID,否则相关的cache空间都不会被自动释放。
4).使用mmap方法申请的MAP_SHARED标志的内存会占用cache空间,除非进程将这段内存munmap,否则相关的cache空间都不会被自动释放。
5).实际上shmget、mmap的共享内存,在内核层都是通过tmpfs实现的,tmpfs实现的存储用的都是cache。
vmstat:可监控虚拟内存使用情况、空闲内存、缓冲、cache等指标,和free工具类似。服务器是否发生swap 可以通过 vmstat 1 查看。
C、磁盘I/O相关 常用工具:iostat、fio、swapon
iostat:可获取每秒读写的数据块数、所有读写块数等,可对磁盘读写性能有个大体了解,并可以模拟顺序以及随机读写磁盘操作;
fio:另一款强大的io压力测试工具,这个工具最大的特点是使用简单,支持的文件操作非常多, 可以覆盖到我们能见到的文件使用方式。
swapon: 显示swap设备的使用情况,如果你启动了swap设备的话。
badblocks 检测磁盘是否故障 --> time dd if=/dev/zero of=/test.dbf count=100000 bs=10k oflag=direct 检测IO 速度 -->
iostat -x -d -k 1 查看IO读写性能, %util 是否过高 --> iotop -o 找出机器上io较高的进程 --> 对cgi频繁IO写操作的目录/usr/local/stat/log/挂载到tmpfs格式的磁盘下,mount -t tmpfs -o size=20m tmpfs /tmpfs; mount -o bind /tmpfs/ /usr/local/stat/log/ 看io 是否能降下来(注:tmpfs格式的磁盘,就是将数据IO操作都在内存进行,可以大大提高IO速度,对某些操作频繁且属于小文件的IO操作很有加速效果)--> strace -p 跟踪io高的进程,看执行什么操作,或者有什么错误产生。
D、网络I/O相关 常用工具:netstat、tcpdump、route、iptarf、netperf、nicstat、ping/traceroute
netstat:是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表、实际的网络连接以及每一个网络接口设备的状态信息;
tcpdump:用于监视TCP/IP连接并直接读取数据链路层的数据包头。可以指定哪些数据包被监视、哪些控制要显示格式;
-w xx.pcap 写入到文件,可以使用 wireshark 打开再用 wireshark 语法过滤下。收包发包都在本机的话记得 -i lo
Tcpdump有一个-A参数,可以以ASCII方式打印出包内容,并用web服务器上的特有url特征字符串如”cgi-bin/”来分割,再把?号后的参数丢弃后排序,即可即时得到服务器上的对象请求的频次排序.不需要修改配置重启http服务器。