🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
找出占用内存资源最多的前 10 个进程 ~~~ ps -auxf | sort -nr -k 4 | head -10 -n数字大小 r反序 k行数 ~~~ 找出占用 CPU 资源最多的前 10 个进程 ~~~ ps -auxf | sort -nr -k 3 | head -10 ~~~ 查看系统平均负载 ~~~ uptime ~~~ 平均负载表示所有CPU的活跃进程数,除以CPU核心数得到每个CPU的平均活跃进程数,数值越大表示每个CPU上运行的进程越多,系统压力越大,当平均值大于0.7时表示系统较为繁忙。<br> CPU核心数可以通过以下命令查看 ~~~ grep 'model name' /proc/cpuinfo |wc -l ~~~ CPU节拍率 * Process Time in Linux is measured in Jiffies. Jiffies are measured in\*“HZ”\*. * Jiffies value can be fetched via`sysconf(_SC_CLK_TCK)`system call) ~~~ grep 'CONFIG_HZ=' /boot/config-$(uname -r) ~~~ 找出是CPU使用率高还是iowait高usr: 用户态CPU使用百分比sys: 内核态CPU使用百分比iowait高表示CPU在等硬盘<br> 查看所有CPU的统计信息,每2秒刷新一次 ~~~ mpstat -P ALL 2 ~~~ ## **cpu 使用率常见指标** ``` * user(通常缩写为 us),代表用户态 CPU 时间。注意,它不包括下面的 nice 时间,但包括了 guest 时间。 * nice(通常缩写为 ni),代表低优先级用户态 CPU 时间,也就是进程的 nice 值被调整 为 1-19 之间时的 CPU 时间。这里注意,nice 可取值范围是 -20 到 19,数值越大,优 先级反而越低。 * system(通常缩写为 sys),代表内核态 CPU 时间。 * idle(通常缩写为 id),代表空闲时间。注意,它不包括等待 I/O 的时间(iowait)。 * iowait(通常缩写为 wa),代表等待 I/O 的 CPU 时间。 * irq(通常缩写为 hi),代表处理硬中断的 CPU 时间。 * softirq(通常缩写为 si),代表处理软中断的 CPU 时间。 * steal(通常缩写为 st),代表当系统运行在虚拟机中的时候,被其他虚拟机占用的 CPU 时间。 * guest(通常缩写为 guest),代表通过虚拟化运行其他操作系统的时间,也就是运行虚 拟机的 CPU 时间。 * guest\_nice(通常缩写为 gnice),代表以低优先级运行虚拟机的时间。 ``` 系统中处于 R 状态的进程数增加引发的 - 系统中处于 D 状态的进程数增加引发的 - Loadavg 数值大于某个值就一定有问题。 其基本思路就是,根据引起 Load 变化的根源是 R 状态任务增多,还是 D 状态任务增多,来进入到不同的流程。 在 Linux 系统里,读取 /proc/stat 文件,即可获取系统中 R 状态的进程数;但 D 状态的任务数恐怕最直接的方式还是使用 ps 命令比较方便。而/proc/stat 文件里 procs\_blocked 则给出的是处于等待磁盘 IO 的进程数: 在 Linux 系统里,读取 /proc/stat 文件,即可获取系统中 R 状态的进程数; 但 D 状态的任务数恐怕最直接的方式还是使用 ps 命令比较方便。而/proc/stat 文件里 procs\_blocked 则给出的是处于等待磁盘 IO 的进程数: 因此 iowait 成为 D 状态分类里定位是否 Load 高是由 IO 引发的一个重要参考。 iowait 高的时候,CPU 正处于空闲状态, 使用pidstat -w 查看进程上下文切换次数 ; ~~~ 03:02:18 PM UID PID cswch/s nvcswch/s Command 03:02:18 PM 0 1 2.82 0.48 systemd 03:02:18 PM 0 2 0.00 0.00 kthreadd 03:02:18 PM 0 4 0.00 0.00 kworker ~~~ cs: 自愿上下文切换,代表内存,I/O资源不足 nvcs: 非自愿上下文切换,CPU时间片已到被系统强制调度,代表CPU竞争激烈<br> 查看硬中断(硬中断是由硬件产生的),软中断(软中断是一些对I/O的请求)。 ~~~ cat /proc/interrupts ~~~ ~~~ cat /proc/softirqs ~~~ <br> pidstat 下面的 pidstat 命令,间隔 1 秒展示了进程的 5 组 CPU 使用率,包括: * 用户态 CPU 使用率 (%usr); * 内核态 CPU 使用率(%system); * 运行虚拟机 CPU 使用率(%guest); * 等待 CPU 使用率(%wait); * 以及总的 CPU 使用率(%CPU)。 最后的 Average 部分,还计算了 5 组数据的平均值。 #### perf top perf top ,类似于 top,它能够实时显示占用 CPU 时钟最多的函数或者指令,可以用来查找热点函数,使用界面如下所示: ~~~bash $ perf top Samples: 583K of event 'cycles:ppp', Event count (approx.): 32449180472 Overhead Shared Object Symbol 4.71% [kernel] [k] update_blocked_averages 2.89% [kernel] [k] do_syscall_64 1.14% [kernel] [k] __entry_trampoline_start 1.13% perf [.] hpp__sort_overhead 1.07% [kernel] [k] syscall_return_via_sysret 1.04% [kernel] [k] cleanup_module 1.00% [kernel] [k] update_load_avg 0.83% perf [.] __hists__insert_output_entry ~~~ Load的增加大致分为两种,系统中处于 R 状态的进程数增加引发的 - 系统中处于 D 状态的进程数增加引发的。 基本思路就是,根据引起 Load 变化的根源是 R 状态任务增多,还是 D 状态任务增多,来进入到不同的流程。 在 Linux 系统里,读取 /proc/stat 文件,即可获取系统中 R 状态的进程数;使用 ps 命令获取D状态的进程数。而/proc/stat 文件里 procs\_blocked 则给出的是处于等待磁盘 IO 的进程数:iowait 高的时候,CPU 正处于空闲状态, **io** ### 查找IO占用情况 查看进程的I/O情况 ~~~ pidstat -d 1 20 ~~~ ### 查看网络数据包发送情况 sar 命令查看每秒接收发送的网络帧数和千字节大小 千字节大小\*1024除以帧数得出平均每个数据包字节数 * rxpck/s txpck/s 每秒接收发送的网络帧数 * rxKB/s txKB/s 每秒接收发送的千字节数 ~~~ [root@host231 ssl]#sar -n DEV 1 ~~~ ### 查找占用CPU时钟最多的函数或指令 使用perf命令查看 -p 指定进程id 实时查看 ~~~ perf top -g ~~~ 统计之后离线查看 ~~~ perf record -g -F 100 --sleep 15 perf report ~~~ ### 工具总结 在分析 CPU、内存、磁盘等的性能指标时,有几种工具是高频出现的,如 top、vmstat、pidstat,总结一下如下: 1. CPU:top、vmstat、pidstat、sar、perf、jstack、jstat; 2. 内存:top、free、vmstat、cachetop、cachestat、sar、jmap; 3. 磁盘:top、iostat、vmstat、pidstat、du/df; 4. 网络:netstat、sar、dstat、tcpdump; 5. 应用:profiler、dump。