1.进程的概念:
程序运行起来就是进程,系统会给进程分配cpu,内存,所属用户和权限....
2.进程的分类
#pstree命令查看进程数,第一列是主进程(systemd)只有一个,第二列是父进程,第三列是子进程,第四列是子子进程,一般进程也就到
第四类--直接看生产环境
[root@node-10 ~]# pstree
systemd─┬─ModemManager───2*[{ModemManager}]
        ├─NetworkManager───2*[{NetworkManager}]
        ├─VGAuthService
        ├─Walnuts-Main───22*[{Walnuts-Main}]
        ├─abrt-dbus───3*[{abrt-dbus}]
        ├─2*[abrt-watch-log]
        ├─abrtd
        ├─accounts-daemon───2*[{accounts-daemon}]
        ├─at-spi-bus-laun─┬─dbus-daemon
        │                 └─3*[{at-spi-bus-laun}]
        ├─at-spi2-registr───2*[{at-spi2-registr}]
        ├─atd
        ├─auditd─┬─audispd─┬─sedispatch
        │        │         └─{audispd}
        │        └─{auditd}
        ├─avahi-daemon───avahi-daemon
        ├─boltd───2*[{boltd}]
        ├─colord───2*[{colord}]
        ├─comm_srv───15*[{comm_srv}]
        ├─containerd───15*[{containerd}]
        ├─crond
        ├─cupsd
        ├─2*[dbus-daemon]
        ├─dbus-launch
        ├─dconf-service───2*[{dconf-service}]
        ├─dnsmasq───dnsmasq
        ├─dockerd───12*[{dockerd}]
        ├─evolution-addre─┬─evolution-addre───5*[{evolution-addre}]
        │                 └─4*[{evolution-addre}]
        ├─evolution-calen─┬─evolution-calen───8*[{evolution-calen}]
        │                 └─4*[{evolution-calen}]
        ├─evolution-sourc───3*[{evolution-sourc}]
        ├─fwupd───4*[{fwupd}]
        ├─geoclue───2*[{geoclue}]
        ├─gnome-keyring-d───3*[{gnome-keyring-d}]
        ├─gnome-shell-cal───5*[{gnome-shell-cal}]
        ├─goa-daemon───4*[{goa-daemon}]
        ├─goa-identity-se───3*[{goa-identity-se}]
        ├─gsd-printer───2*[{gsd-printer}]
        ├─gssproxy───5*[{gssproxy}]
        ├─gvfs-afc-volume───3*[{gvfs-afc-volume}]
        ├─gvfs-goa-volume───2*[{gvfs-goa-volume}]
        ├─gvfs-gphoto2-vo───2*[{gvfs-gphoto2-vo}]
        ├─gvfs-mtp-volume───2*[{gvfs-mtp-volume}]
        ├─gvfs-udisks2-vo───2*[{gvfs-udisks2-vo}]
        ├─gvfsd─┬─gvfsd-trash───2*[{gvfsd-trash}]
        │       └─2*[{gvfsd}]
        ├─gvfsd-fuse───5*[{gvfsd-fuse}]
        ├─gvfsd-metadata───2*[{gvfsd-metadata}]
        ├─ibus-portal───2*[{ibus-portal}]
        ├─ibus-x11───2*[{ibus-x11}]
        ├─icsfilesec───icsfilesec───16*[{icsfilesec}]
        ├─irqbalance
        ├─java───112*[{java}]
        ├─2*[java───60*[{java}]]
        ├─ksmtuned───sleep
        ├─libvirtd───16*[{libvirtd}]
        ├─lsmd
        ├─lvmetad
        ├─mission-control───3*[{mission-control}]
        ├─nginx───4*[nginx]
        ├─packagekitd───2*[{packagekitd}]
        ├─pulseaudio───{pulseaudio}
        ├─rngd
        ├─rpcbind
        ├─rsyslogd───2*[{rsyslogd}]
        ├─rtkit-daemon───2*[{rtkit-daemon}]
        ├─smartd
        ├─sshd─┬─sshd───bash───pstree
        │      └─sshd───bash
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─tracker-store───7*[{tracker-store}]
        ├─tuned───4*[{tuned}]
        ├─udisksd───4*[{udisksd}]
        ├─upowerd───2*[{upowerd}]
        ├─vmtoolsd───{vmtoolsd}
        ├─vmtoolsd───2*[{vmtoolsd}]
        ├─wpa_supplicant
        └─xdg-permission-───2*[{xdg-permission-}]
2.1 主进程
centos7中linux第一个进程是systemd,所有的父进程都归systemd管。
2.2 父进程
运行一个程序就会出现一个进程,这个进程就是父进程,所有的父进程归主进程(systemd)管,父进程不处理具体的业务
2.3 子进程
父进程会产生一个或多个子进程来处理请求和业务,待子进程处理完成任务后,关闭子进程,回收分配给子进程的系统资源(cpu,内存....)
2.4 僵尸进程
僵尸进程是一个不好的进程,也不处理业务,也不告知父进程回收系统资源。僵尸进程可以通过关闭父进程来间接的关闭僵尸进程。
2.5 孤儿进程
也是一个不好的进程,父进程故障了,子进程无父进程管理,由systemd主进程直接接管。
2.6 守护进程
持续运行的进程,一般是系统必须运行的服务,例如:network和sshd服务....
3.管理和监控进程:
3.1 监控进程
监控通过2个命令,ps和top,更推荐使用top查看,ps只能查看你查询的那个节点的进程的状态,而top会默认每隔3s更新一次进程的状态。
3.2 平均负载
通过平均负载的中使用到的命令逐渐理解top,和ps命令里的一些参数。
查询cpu的核心数:
#lscpu查看机器有多少个cpu,每个cpu有多少个核心
[root@node-10 ~]# lscpu
.....
CPU(s):                384              #384个核心   
.....
Core(s) per socket:    24        #每个cpu,有24个核心
Socket(s):             8            #8个cpu
.....
#此外还有其他命令来查询cpu的核心数:
    cat /proc/cpuinfo 
    lscpu
    top 按1平均负载主要有cpu的使用率和磁盘IO的使用率决定,当系统的平均负载接近系统cpu总核心数的70%,系统就比较繁忙了。
#使用w命令查看进程的状态:load average: 0.19, 0.21, 0.21 分别表示1分钟,5分钟,15分钟的平均负载
[root@yw08xcjs001 ~]# w
 00:29:52 up 54 days,  6:36,  1 user,  load average: 0.04, 0.06, 0.09
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    172.16.2.111     00:10    0.00s  0.16s  0.01s w分析系统的平均负载
#举例:
如果平均负载为2,机器有4,2,1个核心
4核心,平均负载为2,核心占用%50
2个核心,平均负载为2,核心占用%100
1个核心,平均负载为2,1个进程没有核心来出处理。
如果1,5,15分钟内的平均负载基本相同,说明系统运行很平稳。
如果1分钟远小于15分钟的值,过去15分钟的负载高,负载逐渐减下来了。
如果1分钟远大于15分钟的值,负载突然持续上升,过去15分钟负载正常。
一旦平均负载超过cpu核心总数,表明系统负载很高,需要进行优化。
3.2 cpu导致平均负载高
使用压力来提高cpu的使用率,致使平均负载高
#stress 命令详解
stress --cpu 8 --io 4 --vm 2 --vm-bytes 128M --timeout 10s
    --cpu 生成多少个进程供几个核心使用。
    --io  同时进行磁盘io的进程数
    --vm  几个进程
    --vm-bytes 每个进程占用多少内存空间
    --timeout  持续多久#压力测试-产生3个进程占用3个核心,运行时间是999999
[root@ceshi ~]# stress --cpu 3 --timeout 999999
#查看cpu负载,watch每2s更新一次并显示不同的地方。
[root@ceshi ~]# watch -dc w      
 19:15:56 up 7 min,  2 users,  load average: 3.04, 1.53, 0.64
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     pts/0    10.0.0.1         19:08    2:52   2:50   0.00s stress --cpu 3 --timeout 999999
root     pts/1    10.0.0.1         19:13    4.00s  0.08s  0.00s w
#通过top命令查看什么进程导致的负载高,top命令默认是以cpu的使用率进行排序的。%CPU 表示cpu的使用率。
#COMMAND 进程的名字
[root@ceshi ~]# top    
top - 19:16:26 up 8 min,  2 users,  load average: 3.02, 1.67, 0.71
Tasks: 112 total,   5 running, 107 sleeping,   0 stopped,   0 zombie
%Cpu(s):100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2859800 total,  2321484 free,   145060 used,   393256 buff/cache
KiB Swap:  3145724 total,  3145724 free,        0 used.  2494048 avail Mem 
   PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                     
  1943 root      20   0    7312    100      0 R 33.2  0.0   1:06.88 stress                                                                      
  1944 root      20   0    7312    100      0 R 33.2  0.0   1:06.88 stress                                                                      
  1942 root      20   0    7312    100      0 R 32.9  0.0   1:06.88 stress 
  
#ps auxf显示出父进程与子进程的关系并用grep,筛选出stress进程。(此进程为top命令中,查看到cpu使
#用率高的进程)
[root@ceshi ~]#  ps auxf | grep stress
root       1941  0.0  0.0   7312   428 pts/0    S+   19:13   0:00  |       \_ stress --cpu 3 --timeout 999999
root       1942 33.0  0.0   7312   100 pts/0    R+   19:13   2:01  |           \_ stress --cpu 3 --timeout 999999
root       1943 33.0  0.0   7312   100 pts/0    R+   19:13   2:01  |           \_ stress --cpu 3 --timeout 999999
root       1944 33.0  0.0   7312   100 pts/0    R+   19:13   2:01  |           \_ stress --cpu 3 --timeout 999999
root       1991  0.0  0.0 112808   964 pts/1    S+   19:19   0:00          \_ grep --color=auto stress
#对应占用cpu利用率高的进程通过pkill + 进程名字 命令,将进程杀掉
[root@ceshi ~]# pkill stress
#杀掉进程后验证平均负载是否恢复正常。 3.3 IO导致平均负载高
用压力测试stress来提高磁盘的IO
#stress的io参数, 不显示磁盘进程占用情况,显示的是系统进程占用情况,--io调用的是系统的syn函数,函数与系
统内核进行沟通,所以显示的是系统进程负载高,需要使用-hdd参数
stress  --io 2    --vm 2 --vm-bytes 128M --timeout 100s
#可以看到97.4 sy,sy表示系统负载高,
[root@ceshi ~]# top
top - 19:38:03 up 29 min,  2 users,  load average: 0.72, 0.23, 0.45
Tasks: 113 total,   6 running, 107 sleeping,   0 stopped,   0 zombie
%Cpu(s):  2.6 us, 97.4 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  2859800 total,  2221284 free,   244732 used,   393784 buff/cache
KiB Swap:  3145724 total,  3145724 free,        0 used.  2394196 avail Mem #使用--hdd 命令,会压测磁盘io负载
[root@ceshi ~]# stress --hdd 8 --hdd-bytes 1g 8个进程,每个进程写1个g
#top命令查看, 61.0 wa(第三行),61.0 wa:cpu等待IO完成的时间,磁盘读写速度太慢,cpu需要等待磁盘
#IO完成之后,cpu才能处理数据。
[root@ceshi ~]# top
top - 19:41:31 up 33 min,  2 users,  load average: 3.88, 1.75, 1.00
Tasks: 118 total,   7 running, 111 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.7 us, 30.1 sy,  0.0 ni,  0.0 id, 61.0 wa,  0.0 hi,  8.2 si,  0.0 st
KiB Mem :  2859800 total,    99568 free,   149432 used,  2610800 buff/cache
KiB Swap:  3145724 total,  3145724 free,        0 used.  2457296 avail Mem 
#看到IO负载高后,查看哪个进程导致IO负载高。iotop -o 查看哪些进程正在使用IO。
[root@ceshi ~]# iotop -o
Total DISK READ : 0.00 B/s | Total DISK WRITE :     243.13 M/s
Actual DISK READ: 0.00 B/s | Actual DISK WRITE:     222.79 M/s
   TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                                                                
  2123 be/4 root        0.00 B/s   31.17 M/s  0.00 % 99.99 % stress --hdd 8 --hdd-bytes 1g
  2124 be/4 root        0.00 B/s   31.17 M/s  0.00 % 99.99 % stress --hdd 8 --hdd-bytes 1g
  2125 be/4 root        0.00 B/s   30.28 M/s  0.00 % 99.99 % stress --hdd 8 --hdd-bytes 1g
  2121 be/4 root        0.00 B/s   30.28 M/s  0.00 % 99.99 % stress --hdd 8 --hdd-bytes 1g
  2127 be/4 root        0.00 B/s   30.28 M/s  0.00 % 99.99 % stress --hdd 8 --hdd-bytes 1g
  2063 be/4 root        0.00 B/s    0.00 B/s  0.00 % 99.99 % [kworker/u256:1]
  2126 be/4 root        0.00 B/s   30.28 M/s  0.00 % 99.99 % stress --hdd 8 --hdd-bytes 1g
  2122 be/4 root        0.00 B/s   30.28 M/s  0.00 % 99.99 % stress --hdd 8 --hdd-bytes 1g
  2120 be/4 root        0.00 B/s   29.39 M/s  0.00 % 99.99 % stress --hdd 8 --hdd-bytes 1g
  2111 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.89 % [kworker/0:1]
#过滤出读写的进程将进程pkill掉。
[root@ceshi ~]# pkill stress
#杀掉进程后验证平均负载是否恢复正常。 3.4 故障排查的思路
系统平均负载高
监控和业务反馈负载高,网站访问缓慢。
top查看cpu负载高(%CPU)还是io负载高(0.0 wa)。
cpu负载高,top命令就能看出来。
io负载高,通过iotop -o命令查看哪些进程导致的io负载高
分析进程:
找出对应的进程,是否可以pkill掉进程(牧马或者肉鸡进程,挖矿进程...)
如果进程不能pkill通过查看日志,来判断什么原因导致的。
高阶:通过strace(显示命令执行过程)或者ltrace(显示命令执行过程和调用依赖)命令跟踪进程和命令执行过程。 (开发协助一起看)
top验证是否平均负载是否恢复。
3.5 ps命令详解
ps命令:只会显示你查询的时候的状态,(类似于给进程的状态拍了个照片)
ps -ef 查看进程信息,比ps aux唯一 猛的地方就是多了父进程的ID列。
auxf 在进程列(COMMAND)显示父进程子进程的关系。
#ps aux 每一列命令详解
USER:进程属于的用户  
PID:进程的id  
%CPU %MEM:进程占用的cpu和内存百分比   
VSZ   RSS:占用虚拟内存和物理内存的大小    
TTY:进程属于哪个终端  
STAT:进程的状态    
START:进程开启的时间   
TIME:进程已经占用cpu的时间   
COMMAND:进程名称或叫命令
[root@ceshi ~]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.1 125752  4272 ?        Ss   12:59   0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
polkitd    1070  0.0  0.4 612248 13272 ?        Ssl  12:59   0:00 /usr/lib/polkit-1/polkitd --no-debug
root     103164  0.0  0.0 184584  2572 ?        S    18:08   0:00 /usr/sbin/CROND -n
root     103217  0.0  0.0 157552  1920 pts/0    R+   18:08   0:00 ps -aux
root     103218  0.0  0.0 112816   952 pts/0    S+   18:08   0:00 grep --color=auto R
polkitd  119118  8.7  0.0 619928 14408 ?        Rsl  Feb09 11944:49 /usr/lib/polkit-1/polkitd --no-debug
root       1072  0.0  0.2  99688  6084 ?        Ss   12:59   0:00 /usr/bin/VGAuthService -s
root       1604  0.0  0.0  89704  2228 ?        Ss   12:59   0:00 /usr/libexec/postfix/master -w
postfix    1623  0.0  0.1  89876  4088 ?        S    12:59   0:00 qmgr -l -t unix -u
root       1880  0.0  0.2 157324  5916 ?        Ss   12:59   0:00 sshd: root@pts/0
root       1882  0.0  0.1 116580  3212 pts/0    Ss   12:59   0:00 -bash
root       2719  0.2  0.1 116464  2924 tty1     Ss   17:43   0:00 -bash
root       2741  0.0  0.0 108052   352 tty1     S+   17:43   0:00 sleep 9999
root       3220  0.0  0.0      0     0 ?        S<    2021   0:00 [scsi_tmf_24]
postfix    2567  0.0  0.1  89808  4072 ?        S    16:19   0:00 pickup -l -t unix -u
nginx      2665  0.0  0.0  39692  1820 ?        S    17:00   0:00 nginx: worker process
root       9800  0.0  0.0  55528  1032 ?        S<sl  2021   1:17 /sbin/auditd
root       9802  0.0  0.0  84556   908 ?        S<sl  2021   1:14 /sbin/audispd
root       9804  0.0  0.0  55636  1344 ?        S<    2021   0:48 /usr/sbin/sedispatch
rpc        9829  0.0  0.0  69272  1436 ?        Ss    2021   0:22 /sbin/rpcbind -w
avahi      9833  0.0  0.0  62284  2280 ?        Ss    2021  20:06 avahi-daemon: running [node-20.local]
root       9834  0.0  0.0 225828  4752 ?        Ss    2021   3:25 /usr/bin/abrt-watch-log -F BUG: WARNING: at WARNING: CPU: INFO: possible recurs
dbus       9835  3.5  0.0  62764  4232 ?        Ss    2021 9042:06 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --system
avahi      9839  0.0  0.0  62152   392 ?        S     2021   0:00 avahi-daemon: chroot helper
rtkit      9843  0.0  0.0 198800  1748 ?        SNsl  2021   1:38 /usr/libexec/rtkit-daemon
root       9844  0.0  0.0  26760  2212 ?        Ss    2021   6:56 /usr/lib/systemd/systemd-logind
root       9845  0.0  0.0 356876  5212 ?        Ssl   2021   1:17 /usr/sbin/ModemManager
root       9849  0.0  0.0  21692  1336 ?        Ss    2021  27:13 /usr/sbin/irqbalance --foreground
VSZ:进程占用的虚拟内存大小,就是是物理内存+交换分区空间(swap空间),swap空间使用磁盘空间配置,当系统内存不足,swap空间可以临时补充。
RSS:进程占用的物理内存大小。
linux如果内存不足,主进程不知道哪个进程导致内存不足,会随机挑选进程kill。如果是进程导致内存不足,会kill掉这个进程。
#查看机器的所有内存
[root@node-10 ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:            15G        4.8G        204M        738M         10G        9.5G
Swap:           15G        756M         15G
终端:远程连接占用一个窗口,就是一个终端。?代表后台运行进程,带pts就是前台进程。带tty的表示服务器直接登录。
STAT:进程状态,
TIME:cpu的核心在每个任务中间切换的足够快,每个任务占用cpu多长时间。










