一文搞懂linux进程

知是行的主意,行是知的功夫。这篇文章主要讲述一文搞懂linux进程相关的知识,希望能为你提供帮助。
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
USERTTYFROMLOGIN@IDLEJCPUPCPU WHAT
rootpts/0172.16.2.11100:100.00s0.16s0.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
USERTTYFROMLOGIN@IDLEJCPUPCPU WHAT
rootpts/010.0.0.119:082:522:500.00s stress --cpu 3 --timeout 999999
rootpts/110.0.0.119:134.00s0.08s0.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 USERPRNIVIRTRESSHR S %CPU %MEMTIME+ COMMAND
1943 root20073121000 R 33.20.01:06.88 stress
1944 root20073121000 R 33.20.01:06.88 stress
1942 root20073121000 R 32.90.01:06.88 stress

#ps auxf显示出父进程与子进程的关系并用grep,筛选出stress进程。(此进程为top命令中,查看到cpu使
#用率高的进程)
[root@ceshi ~]#ps auxf | grep stress
root19410.00.07312428 pts/0S+19:130:00|\\_ stress --cpu 3 --timeout 999999
root1942 33.00.07312100 pts/0R+19:132:01|\\_ stress --cpu 3 --timeout 999999
root1943 33.00.07312100 pts/0R+19:132:01|\\_ stress --cpu 3 --timeout 999999
root1944 33.00.07312100 pts/0R+19:132:01|\\_ stress --cpu 3 --timeout 999999
root19910.00.0 112808964 pts/1S+19:190:00\\_ grep --color=auto stress


#对应占用cpu利用率高的进程通过pkill + 进程名字 命令,将进程杀掉
[root@ceshi ~]# pkill stress



#杀掉进程后验证平均负载是否恢复正常。



3.3 IO导致平均负载高【一文搞懂linux进程】用压力测试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
TIDPRIOUSERDISK READDISK WRITESWAPINIO> COMMAND
2123 be/4 root0.00 B/s31.17 M/s0.00 % 99.99 % stress --hdd 8 --hdd-bytes 1g
2124 be/4 root0.00 B/s

    推荐阅读