排查步骤
当 Linux 系统的 CPU 平均负载很高时,可能是由于系统中的某些进程或服务正在消耗大量的 CPU 资源。以下是一些可能的排查步骤:
-
使用
top
命令查看 CPU 占用率:在终端中输入top
命令,可以查看当前系统中占用 CPU 资源最多的进程和服务。按下Shift + P
可以按 CPU 占用率排序。 -
使用
ps
命令查看进程:在终端中输入ps -ef
命令,可以列出系统中正在运行的所有进程。可以根据进程 ID、进程名称等过滤出具体的进程信息。 -
使用
htop
命令查看进程:htop
命令是一个更加强大的进程监视器,可以通过终端安装。执行htop
命令可以查看进程的详细信息,包括 CPU 占用率、内存使用情况等。 -
检查系统日志:在
/var/log
目录下,有许多系统日志文件,例如/var/log/syslog
、/var/log/messages
等。可以查看这些日志文件,寻找与 CPU 占用率高相关的错误或警告信息。 -
使用
sar
命令查看系统资源使用情况:sar
命令是一个系统性能监视器,可以用于查看系统的 CPU、内存、网络等资源使用情况。执行sar -u
命令可以查看 CPU 使用情况。 -
检查磁盘使用情况:当磁盘空间不足时,可能会导致系统 CPU 平均负载很高。可以使用
df -h
命令查看磁盘使用情况。 -
检查网络流量:当系统中有大量的网络流量时,可能会导致 CPU 平均负载很高。可以使用
iftop
命令查看网络流量情况。
以上是一些可能的排查步骤,可以帮助您找到系统中消耗 CPU 资源的进程或服务。根据具体情况,您可能需要采取不同的措施来解决问题,例如优化代码、增加硬件资源、调整系统配置等。
排查思路
load average
Top load average是指系统在过去1分钟、5分钟和15分钟内的平均负载情况。它是一个用于衡量系统负载的指标,表示在这个时间段内有多少个进程正在等待CPU资源。如果这个数字超过了CPU核心数,就表示系统的负载已经超过了其处理能力,可能会导致系统变慢或崩溃。因此,系统管理员经常使用top命令来监控系统的负载情况,以便及时调整系统配置或处理负载过高的进程。
lscpu
lscpu是一个Linux/Unix命令,用于显示系统的CPU架构信息,包括CPU型号、CPU架构、CPU核心数量、CPU频率、CPU缓存信息等等。lscpu的输出结果是可读性很强的,可以方便地了解系统的CPU信息。
常用的lscpu选项包括:
- -a或–all:显示所有CPU信息;
- -p或–parse:以逗号分隔的形式输出CPU信息;
- -s或–sysroot:在指定的根目录下查找CPU信息;
- -x或–hex:以16进制格式输出CPU信息;
- -y或–physical:显示物理CPU信息。
例如,要查看系统的CPU信息,可以在终端中输入以下命令:
lscpu
该命令会输出系统的CPU架构信息,包括CPU型号、CPU架构、CPU核心数量、CPU频率、CPU缓存信息等等。
ps -ef
ps -ef命令可以列出系统中所有进程的详细信息,其中包括进程的状态。下面是各个进程状态的说明:
- D:不可中断的睡眠状态,通常是在等待某些事件(如磁盘I/O)完成时进入的状态。
- R:运行状态,表示进程正在执行或等待执行。
- S:可中断的睡眠状态,通常是在等待某些事件(如网络I/O)完成时进入的状态。
- T:暂停状态,表示进程被挂起,无法执行任何操作。
- Z:僵尸状态,表示进程已经终止,但是其父进程尚未对其进行善后处理(如调用wait()函数)。
- <:高优先级进程。
- N:低优先级进程。
- +:在前台运行的进程。
- s:会话组长进程。
- l:多线程进程。
- Ss:会话组长进程,且进程已经被停止。
- S<:高优先级进程,且进程已经被停止。
- SN:低优先级进程,且进程已经被停止。
- SZ:僵尸进程。
- R+:在前台运行的高优先级进程。
- R<:在前台运行的低优先级进程。
在ps -ef命令的输出中,进程状态通常位于第8列。例如,以下命令可以列出所有进程的详细信息,包括进程状态:
ps -ef
两者都是用于列出当前运行的进程信息的命令,但是在不同的操作系统中有不同的用法和输出格式。
在Linux系统中,ps命令有两种常见的输出格式:BSD和SYSV。其中,BSD格式的命令是ps aux,SYSV格式的命令是ps -ef。
ps aux输出格式中,a表示列出所有进程,u表示以用户为主要输出格式,x表示列出没有控制终端的进程。输出结果中包括进程ID、CPU占用率、内存占用率、启动时间、命令等信息。
ps -ef输出格式中,e表示列出所有进程,f表示以完整的格式输出进程信息。输出结果中包括进程的所有信息,包括父进程ID、会话ID、进程组ID、用户ID、CPU占用率、内存占用率、启动时间、命令等信息。
因此,两者的区别主要在于输出格式的不同,但都能够列出当前运行的进程信息。
egrep
grep
和egrep
都是Linux系统中用于文本搜索的命令,它们的主要区别在于正则表达式的支持程度。
grep
命令使用基本正则表达式(BRE),它支持一些基本的正则表达式元字符,如^
、$
、.
、*
、[]
等,但不支持一些高级元字符,如+
、?
、|
等。egrep
命令使用扩展正则表达式(ERE),它支持基本正则表达式中的所有元字符,同时还支持一些高级元字符,如+
、?
、|
等。
因此,如果需要使用高级正则表达式元字符进行文本搜索,则应该使用egrep
命令。如果只需要使用基本的正则表达式元字符,则可以使用grep
命令。
iostat
iostat是一个用于监控系统磁盘I/O性能的命令行工具,可以显示每个磁盘设备的读写速度、I/O请求队列长度、CPU利用率等信息。iostat可以帮助用户了解磁盘I/O的瓶颈,以便进行系统调优。
使用iostat命令时,可以使用以下选项:
-i:显示磁盘I/O请求队列的长度和每秒钟的I/O请求次数;
-k:以KB/s为单位显示磁盘读写速度;
-m:以MB/s为单位显示磁盘读写速度;
-t:显示统计数据的时间间隔。
例如,要每秒钟显示一次磁盘I/O性能,可以在终端中输入以下命令:
iostat -k 1
该命令将以KB/s为单位显示磁盘读写速度,每秒钟更新一次数据。iostat的输出结果包含以下字段:
- Device:磁盘设备名称;
- tps:每秒钟的I/O请求次数;
- kB_read/s:每秒钟读取的数据量(KB);
- kB_wrtn/s:每秒钟写入的数据量(KB);
- kB_dscd/s:每秒钟丢弃的数据量(KB);
- %util:磁盘利用率。
这些信息可以帮助我们了解磁盘I/O的性能瓶颈,以便进行系统调优。
pidstat
pidstat是一个Linux性能监测工具,它可以用于监测进程的CPU使用率、内存使用率、I/O使用率等情况。pidstat可以显示每个进程的统计数据,也可以显示所有进程的总体统计数据。
pidstat的常用选项包括:
- -u:显示CPU使用率。
- -r:显示内存使用率。
- -d:显示磁盘I/O使用率。
- -p pid:指定要监测的进程ID。
- -h:以易于理解的格式输出数据。
例如,使用以下命令可以显示进程ID为1234的进程的CPU和内存使用率:
pidstat -u -r -p 1234
使用以下命令可以显示所有进程的CPU和内存使用率:
pidstat -u -r
sar
sar是一个用于Linux系统性能监测的命令行工具,可以用于收集和显示各种系统资源的历史数据,包括CPU使用率、内存使用率、磁盘I/O、网络传输等。sar可以定期收集系统性能数据,以便后续分析和优化。
sar的常用选项包括:
- -u:显示CPU使用率。
- -r:显示内存使用率。
- -d:显示磁盘I/O使用率。
- -n:显示网络传输使用率。
- -q:显示系统负载数据。
- -p:显示进程活动数据。
- -f file:指定sar数据文件进行分析。
- -s start_time:指定开始时间。
例如,使用以下命令可以每隔5秒收集一次CPU使用率、内存使用率和磁盘I/O使用率数据:
sar -u -r -d 5
使用以下命令可以从sar数据文件中分析CPU使用率和内存使用率数据:
sar -f /var/log/sysstat/sa01 -u -r
sar命令还可以与其他工具结合使用,例如使用sar和gnuplot结合生成CPU使用率图表:
sar -u 1 10 | grep '^Average:' | gnuplot -e "set terminal png; set output 'cpu.png'; plot '-' using 3 with lines title 'CPU'"