由於對 Linux 作業系統的興趣和對底層知識的渴望,我整理了這篇文章。它可以作為檢驗基礎知識的指標,並涵蓋了系統的各個方面。如果沒有完整的電腦系統、網路和作業系統知識,文件中的工具將無法完全掌握。此外,對系統效能分析和最佳化是一個長期的系列。
本文檔主要是結合 Linux 大牛、Netflix 高級效能架構師 Brendan Gregg 更新的 Linux 效能調優工具博文,收集 Linux 系統效能優化相關文章整理而成的一篇綜合性文章。主要是結合博文對涉及的原理和性能測試工具進行說明。
背景知識:在分析效能問題時,了解背景知識是必要的。例如硬體緩存;再比如作業系統核心。應用程式的行為細節往往與這些東西相互牽扯,這些底層東西會以意想不到的方式影響應用程式的效能。例如,某些程式無法充分利用緩存,從而導致效能下降。例如,不必要地調用過多的系統調用,造成頻繁的核心/用戶切換等。
#首先來看一張圖:
上圖是Brendan Gregg 的一次效能分析的分享,這裡面的所有工具都可以透過man
來獲得它的幫助文檔,下面簡單介紹介紹一下常規的用法:
vmstat(VirtualMeomoryStatistics,虛擬記憶體統計)是 Linux 中監控記憶體的常用工具,可監控作業系統的虛擬記憶體、進程、CPU 等的整體狀況。 vmstat 的常規用法:vmstat interval times
即每隔interval
秒取樣一次,共取樣times
次,如果省略times
,則一直採集數據,直到使用者手動停止為止。簡單舉個例子:
可以使用 ctrl c
停止 vmstat
擷取資料。
第一行顯示了系統自啟動以來的平均值,第二行開始顯示現在正在發生的情況,接下來的行會顯示每5秒間隔發生了什麼,每一列的含義在頭部,如下所示:
記憶體不足的表現:free memory 急劇減少,回收buffer 和cache 也無濟於事,大量使用交換分割區(swpd),頁面交換(swap)頻繁,讀寫磁碟數量(io)增多,缺頁中斷(in)增多,上下文切換(cs)次數增多,等待IO的進程數(b)增多,大量CPU時間用於等待IO(wa)
iostat 用於報告中央處理器(CPU)統計信息和整個系統、適配器、tty 設備、磁碟和CD-ROM 的輸入/輸出統計信息,默認顯示了與vmstat 相同的cpu 使用信息,使用以下命令顯示擴充功能的設備統計:
第一行顯示的是自系統啟動以來的平均值,然後顯示增量的平均值,每個裝置一行。
常見 linux 的磁碟 IO 指標的縮寫習慣:rq 是 request,r 是 read,w 是 write,qu 是 queue,sz 是 size,a 是verage,tm 是 time,svc 是 service。
dstat 顯示了 cpu 使用情況,磁碟 io 情況,網路發包情況和換頁情況,輸出是彩色的,可讀性較強,相對於 vmstat 和iostat 的輸入更加詳細且較為直觀。使用時,直接輸入指令即可,當然也可以使用特定參數。
如下:dstat –cdlmnpsy
#iotop指令是專門顯示硬碟IO的指令,介面風格類似top指令,可以顯示IO負載具體是由哪個行程產生的。是用來監視磁碟I/O使用狀況的top類工具,具有與top相似的UI,其中包括PID、使用者、I/O、進程等相關資訊。
可以以非互動的方式使用:
iotop –bod interval
查看每個行程的 I/O
,可以使用
pidstat,pidstat –d instat
pidstat 主要用於監控全部或指定進程佔用系統資源的情況,如 CPU,記憶體、裝置 IO、任務切換、執行緒等。
使用方法:
pidstat –d interval
pidstat 还可以用以统计CPU使用信息:
pidstat –u interval
统计内存信息:
pidstat –r interval
任务区域默认显示:进程 ID,有效用户,进程优先级,NICE 值,进程使用的虚拟内存,物理内存和共享内存,进程状态,CPU 占用率,内存占用率,累计 CPU 时间,进程命令行信息。
htop 是 Linux 系统中的一个互动的进程查看器,一个文本模式的应用程序(在控制台或者X终端中),需要 ncurses。
Htop 可让用户交互式操作,支持颜色主题,可横向或纵向滚动浏览进程列表,并支持鼠标操作。
与 top 相比,htop 有以下优点:
mpstat 是 Multiprocessor Statistics的缩写,是实时系统监控工具。其报告CPU的一些统计信息,这些信息存放在 /proc/stat
文件中。在多 CPUs 系统里,其不但能查看所有 CPU 的平均状况信息,而且能够查看特定 CPU 的信息。常见用法:
mpstat –P ALL interval times
netstat 用于显示与 IP、TCP、UDP和 ICMP 协议相关的统计数据,一般用于检验本机各端口的网络连接情况。
常见用法:
netstat –npl # 可以查看你要打开的端口是否已经打开。 netstat –rn # 打印路由表信息。 netstat –in # 提供系统上的接口信息,打印每个接口的MTU,输入分组数,输入错误,输出分组数,输出错误,冲突以及当前的输出队列的长度。
ps 参数太多,具体使用方法可以参考 man ps
常用的方法:
ps aux #hsserver ps –ef |grep #hundsun
杀掉某一程序的方法:
ps aux | grep mysqld | grep –v grep | awk ‘{print $2 }’ xargs kill -9
杀掉僵尸进程:
ps –eal | awk ‘{if ($2 == “Z”){print $4}}’ | xargs kill -9
跟踪程序执行过程中产生的系统调用及接收到的信号,帮助分析程序或命令执行中遇到的异常情况。
举例:查看 mysqld 在 linux 上加载哪种配置文件,可以通过运行下面的命令:
strace –e stat64 mysqld –print –defaults > /dev/null
能够打印系统总共运行了多长时间和系统的平均负载,uptime 命令最后输出的三个数字的含义分别是 1分钟,5分钟,15分钟内系统的平均负荷。
lsof(list open files)是一个列出当前系统打开文件的工具。通过 lsof 工具能够查看这个列表对系统检测及排错,常见的用法:
查看文件系统阻塞
lsof /boot
查看端口号被哪个进程占用
lsof -i : 3306
查看用户打开哪些文件
lsof –u username
查看进程打开哪些文件
lsof –p 4838
查看远程已打开的网络链接
lsof –i @192.168.34.128
perf 是 Linux kernel 自带的系统性能优化工具。优势在于与 Linux Kernel 的紧密结合,它可以最先应用到加入 Kernel 的new feature,用于查看热点函数,查看 cashe miss 的比率,从而帮助开发者来优化程序性能。
性能调优工具如 perf,Oprofile 等的基本原理都是对被监测对象进行采样,最简单的情形是根据 tick 中断进行采样,即在 tick 中断内触发采样点,在采样点里判断程序当时的上下文。
假如一个程序 90% 的时间都花费在函数 foo() 上,那么 90% 的采样点都应该落在函数 foo() 的上下文中。运气不可捉摸,但我想只要采样频率足够高,采样时间足够长,那么以上推论就比较可靠。因此,通过 tick 触发采样,我们便可以了解程序中哪些地方最耗时间,从而重点分析。
结合以上常用的性能测试命令并联系文初的性能分析工具的图,就可以初步了解到性能分析过程中哪个方面的性能使用哪方面的工具(命令)。
熟练并精通了第二部分的性能分析命令工具,引入几个性能测试的工具,介绍之前先简单了解几个性能测试工具:
github.com/brendangregg/flamegraph
中的开发源代码的程序生成。是一款性能测评工具,对于不同模块的性能测试可以使用相应的工具,想要深入了解,可以参考最下文的附件文档。
是一款性能调优工具,主要是从linux内核源码层进行的调优,想要深入了解,可以参考下文附件文档。
sar(System Activity Reporter系统活动情况报告)是目前LINUX上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC 有关的活动等方面。sar 的常规使用方式:
sar [options] [-A] [-o file] t [n]
其中:t 为采样间隔,n 为采样次数,默认值是1;-o file 表示将命令结果以二进制格式存放在文件中,file 是文件名。options 为命令行选项
以上是Linux 效能分析工具匯總的詳細內容。更多資訊請關注PHP中文網其他相關文章!