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多长时间。