一文搞懂linux进程

Posted wx5a4508d8a2124

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一文搞懂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
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 python3高级编程一文搞懂多进程

一文搞懂supervisor进程管理

一文彻底搞懂Docker中的namespace

一文彻底搞懂Docker中的namespace

一文彻底搞懂Docker中的namespace

一文搞懂进程线程协程