Linux系统基础性能运维

1. 任务查看器top命令 - 系统负载,进程占用CPU

使用top命令,查看当前系统的使用信息和负载,查看linux中各个进程的信息,可以看出每个进程cpu的使用情况,内存的占用情况等等一些有价值的信息。

1.1. 系统区域

top - 21:23:08 up 28 min,  2 users,  load average: 0.04, 0.08, 0.29
Tasks: 121 total,   2 running, 119 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1863032 total,   569728 free,   407688 used,   885616 buff/cache
KiB Swap:  2097148 total,  2097148 free,        0 used.  1258088 avail Mem
  • 第一行综合负载信息

    • 21:23:08 是上一次统计时间,每个一段时间会自动更新一次,比如 3 秒钟。
    • up 28 min,表示系统自从上一次启动之后的运行时间,由于我是在虚拟机里进行测试,时间比较短,这里是28分钟。线上生产环境的机器往往都是以 days 为单位。比如 up 120 days
    • load average:系统最近1分钟,5分钟 和 15分钟的平均负载;三个负载信息分别表示:1分钟、5分钟、15分钟内系统的平均负荷。判断系统负荷是否过重,必须理解load average的真正含义。
      • 当CPU的系统负荷为0,意味CPU负载0
      • 系统负荷为0.5,意味着CPU占用50%
      • 系统负荷为1.7,意味着CPU已经满负荷工作100%,后面等着上70%工作任务。
    • 第一行综合信息通过 uptime 获取到。
  • 第二行是进程信息

    • total:表示已经启动的进程总数。
    • running:正在运行的进程数。
    • sleeping: 正在休眠的进程数。
    • stoped:停止运行的进程数。
    • zombile:僵尸进程总数(TODO 进一步解释)
  • 第三行是CPU信息

    • us:用户空间占用CPU百分比
    • sy:系统内核空间占用CPU百分比
    • ni:用户进程空间内改变过优先级的进程占用CPU百分比
    • id:空闲CPU百分比。
    • wa:等待输入输出的CPU时间百分比
    • hi:硬中断的时间百分比
    • si:软中断的时间百分比
    • st:运行虚拟机所消耗的真实CPU时间百分比,如果没有虚拟机运行该值为0.
  • 第四行是内存信息,以字节为单位,total = free used buff/cache

    • total,可用物理内存的总的空间大小。
    • free,可用物理内存的剩余空间大小。
    • used,已经使用的物理内存的空间大小。
    • buff/cache,表示 buff 和 cache 之和,他们都是系统所使用的内存,buff 是内核使用的内存空间大小,用于速度不对等时数据传输的缓冲区,cache 是 Page Cache 和 Slab 使用的内存,用户缓存数据结果。在其他程序需要内存时,这部分空间会被释放。
      Avail Mem ,在不进行交换的情况下, 有空多少空闲内存可使用使用的估算值, 3.14内核以上才有。
  • 第五行是内存交换空间信息

    • total,交换内存空间大小,一般大于物理内存空间。
    • free,空闲的交换空间大小。
    • used,已经使用的交换空间大小。

1.2. 进程信息区域

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
     1 root      20   0  128596   7260   4196 S   0.0  0.4   0:01.58 systemd
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.00 kthreadd
     4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H
     5 root      20   0       0      0      0 S   0.0  0.0   0:00.07 kworker/u256:0
     6 root      20   0       0      0      0 S   0.0  0.0   0:00.02 ksoftirqd/0
     7 root      rt   0       0      0      0 S   0.0  0.0   0:00.02 migration/0
     8 root      20   0       0      0      0 S   0.0  0.0   0:00.00 rcu_bh
     9 root      20   0       0      0      0 S   0.0  0.0   0:00.22 rcu_sched

第二个区域为进程信息,另外也可以通过 top -H pid 查看一个进程中的线程信息。

  • PID:进程ID。
  • USER:启动进程锁使用的用户名。
  • PR:进程的优先级,由系统内核动态调整,值越低,优先级越高,越容易获得CPU资源。
  • NI:进程的 NICE 值,对于普通进程,RP值是在NI基础之上加 20,该值可以由用户调节,比如使用命令 renice -10 -p 。
  • VIRT:进程所占用的虚拟内存大小,以 KB为单位。
  • RES:进程所用的,未被换出物理内存的大小,以KB为单位。
  • SHR:进程所占用的共享内存的大小,以KB为单位。
  • S: 表示进程的运行状态,S 代表睡眠状态,其余的值还有 D:不可中断的随眠状态,R:运行中,T:跟踪/停止,Z:僵尸状态。
  • %CPU:进程当前占用的CPU资源比例。
  • %MEM:进程当前占用内存资源比例。
  • TIME :进程总计使用的CPU时间。
  • COMMAND:启动进程的程序或命令。

1.3. top交互态命令

  • h 用于帮助信息
    Z,B,E,e   Global: 'Z' colors; 'B' bold; 'E'/'e' summary/task memory scale
    l,t,m     Toggle Summary: 'l' load avg; 't' task/cpu stats; 'm' memory info
    0,1,2,3,I Toggle: '0' zeros; '1/2/3' cpus or numa node views; 'I' Irix mode
    f,F,X     Fields: 'f'/'F' add/remove/order/sort; 'X' increase fixed-width
    R,H,J,C . Toggle: 'R' Sort; 'H' Threads; 'J' Num justify; 'C' Coordinates
  • 0 将0参数的隐藏;
  • 1,2,3 用于显示cpu视图或num节点状态;
  • ltm: 切换负载、任务、内存信息的显示
  • c: 触发命令详细执行
  • ds: 设置显示的刷新间隔
    当按下ds时,你将被提示输入一个值(以秒为单位),它会以设置的值作为刷新间隔。如果你这里输入了1,top将会每秒刷新。

1.4. top常用命令

# 查看系统进程的线程及统计信息
$ top -H -p 967496
Threads:  56 total,   0 running,  56 sleeping,   0 stopped,   0 zombie
%Cpu(s): 42.3 us,  0.3 sy,  0.0 ni, 57.1 id,  0.0 wa,  0.2 hi,  0.1 si,  0.0 st
MiB Mem : 514140.2 total, 297172.7 free, 210791.2 used,   6176.3 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used. 296216.3 avail Mem 

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND       
3385696 root      20   0  727220  38364  11228 S   0.7   0.0 128:19.03 gobgpd        
3385713 root      20   0  727220  38364  11228 S   0.7   0.0 126:19.00 gobgpd        
2548928 root      20   0  727220  38364  11228 S   0.7   0.0  89:11.99 gobgpd        
3382210 root      20   0  727220  38364  11228 S   0.3   0.0 120:16.27 gobgpd        
3385577 root      20   0  727220  38364  11228 S   0.3   0.0 135:23.85 gobgpd

# 查看系统程序执行命令
$ top -c

# 查看系统程序执行命令
$ top -c

# 查看系统cpu核心使用情况
$ top -1

#top进入交互态后,f进行排序和显示选择,  选择需要排序的顺序按s;选择需要显示或不显示的按d或空格;
$ top  / f  / Down / d / q    #这里选择线程数和最后使用cpu作为显示;退出后,发现多了两列nTH和P,范别代表线程数和最后使用CPU;
* nTH     = Number of Threads   
* P       = Last Used Cpu (SMP)

 PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND       nTH  P
4189935 root      20   0  258.4g   0.4g   0.0g S  2491   0.1   5860:52 ./xxx         32  2
3920573 root      20   0    4.6g   1.6g   0.0g R 192.7   0.3   4043:31 test-system          13 33

2. ps命令

ps aux | grep nginx
VSZ -- 虚拟地址空间大小  --> 与top 的 VIRT 对应
RSS -- 实际物理内存大小  --> 与top 的 RES 对应

aux a-所有用户, x-运行, 结合才能列出所有pid 信息,u-user 信息,例如cpu,mem, tty, stat, 等信息,BSD 格式

ef 选项: 使用标准格式显示每一个进程。 有一个PPID, 与aux BSD格式显示方式不同。
  • 这里给出定期查看系统进程脚本
#!/bin/bash
#查看内存占用前5的进程及占用量

LOGFILE=/tmp/top_mem_usage.log  
COUNTER=0
MAX_COUNT=144  # 最大循环次数 

while true
do
  ((COUNTER++))
  if [ $COUNTER -gt $MAX_COUNT ]; then
    echo "Reached max count $MAX_COUNT, exiting"
    break
  fi  
  # 获取内存占用前5进程  
  PS_OUTPUT=$(ps aux --sort=-rss | head -n 6)
  # 构造日志内容,包含计数器值
  LOG_CONTENT="Count: ${COUNTER}\n${PS_OUTPUT}\n\n"
  # 日志写入
  echo -e "${LOG_CONTENT}" >> ${LOGFILE}  
  sleep 600
done

3. cat /proc/pid/status


linux查看某个进程内存占用情况以及/proc/pid/status解释

pid 是你关心的进程pid,例如nginx进程 。其中的
VmRss --> Rss
VmSize --> VSZ

三种方法可以互相对照, 结果是一样的。

  • /proc/pid/status解释
$ cat /proc/9744/status
Name: gedit /*进程的程序名*/
State: S (sleeping) /*进程的状态信息,具体参见http://blog.chinaunix.net/u2/73528/showart_1106510.html*/
Tgid: 9744 /*线程组号*/
Pid: 9744 /*进程pid*/
PPid: 7672 /*父进程的pid*/
TracerPid: 0 /*跟踪进程的pid*/
Uid: 1000    1000    1000    1000 /*uid euid suid fsuid*/
Gid: 1000    1000    1000    1000 /*gid egid sgid fsgid*/
FDSize: 256 /*文件描述符的最大个数,file->fds*/
Groups: 0 4 20 24 25 29 30 44 46 107 109 115 124 1000 /*启动该进程的用户所属的组的id*/
VmPeak: 60184 kB /*进程地址空间的大小*/
VmSize: 60180 kB /*进程虚拟地址空间的大小reserved_vm:进程在预留或特殊的内存间的物理页*/
VmLck: 0 kB /*进程已经锁住的物理内存的大小.锁住的物理内存不能交换到硬盘*/
VmHWM: 18020 kB /*文件内存映射和匿名内存映射的大小*/
VmRSS: 18020 kB /*应用程序正在使用的物理内存的大小,就是用ps命令的参数rss的值 (rss)*/
VmData: 12240 kB /*程序数据段的大小(所占虚拟内存的大小),存放初始化了的数据*/
VmStk: 84 kB /*进程在用户态的栈的大小*/
VmExe: 576 kB /*程序所拥有的可执行虚拟内存的大小,代码段,不包括任务使用的库 */
VmLib: 21072 kB /*被映像到任务的虚拟内存空间的库的大小*/
VmPTE: 56 kB /*该进程的所有页表的大小*/
Threads: 1 /*共享使用该信号描述符的任务的个数*/
SigQ: 0/8183 /*待处理信号的个数/目前最大可以处理的信号的个数*/
SigPnd: 0000000000000000 /*屏蔽位,存储了该线程的待处理信号*/
ShdPnd: 0000000000000000 /*屏蔽位,存储了该线程组的待处理信号*/
SigBlk: 0000000000000000 /*存放被阻塞的信号*/
SigIgn: 0000000000001000 /*存放被忽略的信号*/
SigCgt: 0000000180000000 /*存放被俘获到的信号*/
CapInh: 0000000000000000 /*能被当前进程执行的程序的继承的能力*/
CapPrm: 0000000000000000 /*进程能够使用的能力,可以包含CapEff中没有的能力,这些能力是被进程自己临时放弃的*/
CapEff: 0000000000000000 /*是CapPrm的一个子集,进程放弃没有必要的能力有利于提高安全性*/
Cpus_allowed: 01 /*可以执行该进程的CPU掩码集*/
Mems_allowed: 1 /**/
voluntary_ctxt_switches: 1241 /*进程主动切换的次数*/
nonvoluntary_ctxt_switches: 717 /*进程被动切换的次数*/

4. Sysstat

pidstat是sysstat工具的一个命令,用于监控全部或指定进程的cpu、内存、线程、设备IO等系统资源的占用情况。pidstat首次运行时显示自系统启动开始的各项统计信息,之后运行pidstat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。

sysstat 工具包中除了pidstat,还包含iostat、mpstat、sa 等工具。

  • 在Debian/Ubuntu系统中可以使用下面的命令来安装

    $ apt-get install sysstat
  • CentOS/Fedora/RHEL版本的linux中则使用下面的命令:

    $ yum install -y sysstat

4.1. 使用pidstat查看总体统计

pidstat 是sysstat软件套件的一部分,sysstat包含很多监控linux系统状态的工具,它能够从大多数linux发行版的软件源中获得。

使用pidstat不加任何参数等价于加上-p参数,但是只有正在活动的任务会被显示出来。

$ pidstat
Linux 3.10.0-1160.el7.x86_64 (localhost.localdomain)    2022年08月13日  _x86_64_        (2 CPU)

21时42分29秒   UID       PID    %usr %system  %guest    %CPU   CPU  Command
21时42分29秒     0         1    0.01    0.04    0.00    0.06     1  systemd
21时42分29秒     0         5    0.00    0.01    0.00    0.01     0  kworker/u256:0
21时42分29秒     0         6    0.00    0.00    0.00    0.00     0  ksoftirqd/0
21时42分29秒     0         7    0.00    0.00    0.00    0.00     0  migration/0
21时42分29秒     0         9    0.00    0.01    0.00    0.01     1  rcu_sched
21时42分29秒     0        11    0.00    0.00    0.00    0.00     0  watchdog/0
  • PID 被监控的任务的进程号
  • %usr 当在用户层执行(应用程序)时这个任务的cpu使用率,和 nice 优先级无关。注意这个字段计算的cpu时间不包括在虚拟处理器中花去的时间。
  • %system 这个任务在系统层使用时的cpu使用率。
  • %guest 任务花费在虚拟机上的cpu使用率(运行在虚拟处理器)。
  • %CPU 任务总的cpu使用率。在SMP环境(多处理器)中,如果在命令行中输入-I参数的话,cpu使用率会除以你的cpu数量。
  • CPU 正在运行这个任务的处理器编号。
  • Command 这个任务的命令名称。

4.2. I/O 统计数据

通过使用-d参数来得到I/O的统计数据。比如:

[root@localhost ~]# pidstat -d -p 1290
Linux 3.10.0-1160.el7.x86_64 (localhost.localdomain)    2022年08月13日  _x86_64_        (2 CPU)

21时53分29秒   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
21时53分29秒     0      1290      1.20      0.00      0.00  NetworkManager

IO 输出会显示一些内的条目:

  • kB_rd/s 任务从硬盘上的读取速度(kb)
  • kB_wr/s 任务向硬盘中的写入速度(kb)
  • kB_ccwr/s 任务写入磁盘被取消的速率(kb)

4.3. 内存使用和页面失败

使用-r标记你能够得到内存使用情况的数据。

[root@localhost ~]# pidstat -r -p 1290
Linux 3.10.0-1160.el7.x86_64 (localhost.localdomain)    2022年08月13日  _x86_64_        (2 CPU)

21时55分01秒   UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
21时55分01秒     0      1290      0.76      0.01  474808   8780   0.47  NetworkManager
  • 重要的条目:

    • minflt/s 从内存中加载数据时每秒出现的小的错误的数目,这些不要求从磁盘载入内存页面。
    • majflt/s 从内存中加载数据时每秒出现的较大错误的数目,这些要求从磁盘载入内存页面。
    • VSZ 虚拟容量:整个进程的虚拟内存使用(kb)
    • RSS 长期内存使用:任务的不可交换物理内存的使用量(kb)

4.4. 举例

  1. 你可以通过使用下面的命令来监测内存使用

      # pidstat -r 2 5

    这会给你5份关于page faults的统计数据结果,间隔2秒。这将会更容易的定位出现问题的进程。

  2. 显示所有mysql服务器的子进程

      # pidstat -T CHILD -C mysql
  3. 将所有的统计数据结合到一个便于阅读的单一报告中,U表示用户,r表示内存,d表示IO使用:

      # pidstat -Urd -h

5. 查看磁盘、文件和文件夹大小

当磁盘大小超过标准时会有报警提示,使用df和du命令可能发现问题的所在。

df:可以查看一级文件夹大小、使用比例、档案系统及其挂入点,但对文件却无能为力。
du:可以查看文件及文件夹的大小。

  • df查看个挂入点的情况:
root@ubuntu:/etc# df -h
    Filesystem      Size  Used Avail Use% Mounted on
    udev            470M     0  470M   0% /dev
    tmpfs            98M   11M   87M  11% /run
    /dev/sda1        19G  3.5G   15G  20% /
    tmpfs           488M     0  488M   0% /dev/shm
    tmpfs           5.0M     0  5.0M   0% /run/lock
    tmpfs           488M     0  488M   0% /sys/fs/cgroup
    tmpfs            98M     0   98M   0% /run/user/1000
  • 磁盘的空间报警以后,想查找哪个目录哪个文件占了最多的空间,可以是用du命令:
$ du -h  --max-depth=1
    #列出了当前当前目录下的文件夹的大小:
    224K    ./fonts
    772K    ./syntaxhighlighter
    400K    ./css
    752K    ./js
    5.5M    ./img
    7.6M    .

6. 查看内存占用情况

[root@localhost ~]# free -ht
              total        used        free      shared  buff/cache   available
Mem:           1.8G        397M        556M        9.6M        864M        1.2G
Swap:          2.0G          0B        2.0G
Total:         3.8G        397M        2.5G

7. 网络情况

7.1. iftop

iftop命令可以用来监控网卡的实时流量(可以指定网段)、反向解析IP、显示端口信息等,详细的将会在后面的使用参数中说明。

7.1.1. 安装iftop命令

#  安装依赖
$ yum install flex byacc  libpcap ncurses ncurses-devel libpcap-devel
$ yum install -y iftop

7.1.2. iftop运行命令参考界面如下图:

                    12.5Kb               25.0Kb               37.5Kb               50.0Kb          62.5Kb
└────────────────────┴────────────────────┴────────────────────┴────────────────────┴─────────────────────
192.168.197.129                         => 192.168.197.1                            608b    845b    948b
                                        <=                                          184b    552b    418b
192.168.197.129                         => 192.168.197.2                              0b      0b     54b
                                        <=                                            0b      0b     75b
──────────────────────────────────────────────────────────────────────────────────────────────────────────
TX:             cum:   3.92KB   peak:   2.16Kb                            rates:    608b    845b   0.98Kb
RX:                    1.92KB           1.80Kb                                      184b    552b    493b
TOTAL:                 5.84KB           3.70Kb                                      792b   1.36Kb  1.46Kb
  • 不进行DNS反解析:iftop -n -i eth0
  • =>代表发送数据
  • <=代表接收数据
  • TX:发送
  • RX:接受
  • TOTAL:全部的流量
  • cum:目前累积流量
  • peak:峰值流量
  • rates:平均值,2秒,10秒,40秒的平均流量
  • t 切换显示状态,接受、发送数据
  • p 显示端口

7.1.3. iftop常用命令参数

-i 设定监测的网卡,如:# iftop -i eth1
-B 以bytes为单位显示流量(默认是bits),如:# iftop -B
-n 使host信息默认直接都显示IP,如:# iftop -n
-N 使端口信息默认直接都显示端口号,如: # iftop -N
-F 显示特定网段的进出流量,如# iftop -F 10.10.1.0/24或# iftop -F 10.10.1.0/255.255.255.0
-h(display this message),帮助,显示参数信息
-p 使用这个参数后,中间的列表显示的本地主机信息,出现了本机以外的IP信息;
-b 使流量图形条默认就显示;
-f 这个暂时还不太会用,过滤计算包用的;
-P 使host信息及端口信息默认就都显示;
-m 设置界面最上边的刻度的最大值,刻度分五个大段显示,例:# iftop -m 100M

进入iftop画面后的一些操作命令(注意大小写)

按 h 切换是否显示帮助;
按 n 切换显示本机的IP或主机名;
按 s 切换是否显示本机的host信息;
按 d 切换是否显示远端目标主机的host信息;
按 t 切换显示格式为2行/1行/只显示发送流量/只显示接收流量;
按 N 切换显示端口号或端口服务名称;
按 S 切换是否显示本机的端口信息;
按 D 切换是否显示远端目标主机的端口信息;
按 p 切换是否显示端口信息;
按 P 切换暂停/继续显示;
按 b 切换是否显示平均流量图形条;
按 B 切换计算2秒或10秒或40秒内的平均流量;
按 T 切换是否显示每个连接的总流量;
按 l 打开屏幕过滤功能,输入要过滤的字符,比如ip,按回车后,屏幕就只显示这个IP相关的流量信息;
按 L 切换显示画面上边的刻度;刻度不同,流量图形条会有变化;
按 j 或按 k 可以向上或向下滚动屏幕显示的连接记录;
按 1 或 2 或 3 可以根据右侧显示的三列流量数据进行排序;
按 < 根据左边的本机名或IP排序;
按 > 根据远端目标主机的主机名或IP排序;
按 o 切换是否固定只显示当前的连接;
按 f 可以编辑过滤代码,这是翻译过来的说法,我还没用过这个!
按 ! 可以使用shell命令,这个没用过!没搞明白啥命令在这好用呢!
按 q 退出监控

7.2. nethogs

7.2.1. nethogs命令安装

nethogs工具可以帮助我们很方便的查看当前系统中的进程使用网络的情况,这有助于我们找到当前系统中的网络瓶颈。nethogs命令需要首先安装,我们首先来下载

nethogs工具,执行命令:wget https://github.com/raboof/nethogs/archive/vXX.XX.XX.tar.gz

因此,我们尽量不要使用该版本的nethogs。

在下载下nethogs工具后,我们首先安装nethogs工具的依赖包,执行命令:

yum install -y libpcap libpcap-devel

之后,我们将该压缩包解压,如下所示:

该源码包不需要进行预编译过程,执行编译和安装即可,我们执行命令:

make && make install

即可完成nethogs工具的安装。

7.2.2. nethogs命令使用

nethogs安装完成后,nethogs命令会出现在/usr/local/sbin/目录下,我们直接执行命令:

nethogs

即可查看当前使用网络的进程,该命令执行结果如下所示:

从上图中可以看出,我们可以借助nethogs工具,查看当前系统中所有使用网络的进程了,借此可以分析当前系统中的网络瓶颈。

8. 基础性能排障实例

  1. 先用top命令看linux系统总体的cpu使用情况
    如果有异常,用pidstat -p查看细粒度的各个进程的cpu使用情况;否则,转向下一步。

  2. pidstat -r命令查看linux系统总体的内存使用情况
    如果有异常,用pidstat -r -p 1290查看细粒度的各个进程的内存使用情况;否则,转向下一步。

  3. pidstat -d命令查看linux系统总体的IO使用情况
    如果有异常,用pidstat -r -p 1290查看细粒度的各个进程的IO使用情况;否则,转向下一步。

  4. iftop命令查看linux系统总体的网络使用情况
    如果有异常,用nethogs查看细粒度的各个进程的网络带宽使用情况。

发表评论

邮箱地址不会被公开。 必填项已用*标注