每个进程占用内存排序

 一、内存使用率排序

1、容器内存占用、限制查看

docker stats $(docker ps --format '{{.Names}}')
docker stats --format "table {{.Name}}\t{{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"
docker stats $(docker ps | awk '{if(NR>1) print $NF}')
docker stats --format "table {{.Name}}\t{{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}" 

2、找出当前系统CPU使用量较高的进程

ps -aux | sort -rnk 3 | head -20  (3 换 4,为内存)

3、查看进程按内存从大到小排列

ps -eo  "%C : %p : %z : %a"|sort -k5 -nr

4、按 CPU 利用率从大到小排列

ps -eo  "%C : %p : %z : %a"|sort -nr

5、查看占用内存最高的进程

ps aux|head -1;ps aux|grep -v PID|sort -rn -k +4|head

6、pidstat  -r  查看每个进程的内存占用

pidstat -r  | sort -k  9  -nr 
Linux 3.10.0-1160.15.2.el7.centos.plus.x86_64 (storage044) 12/11/2021 _x86_64_ (32 CPU)
10:19:20 AM   UID      PID     minflt/s majflt/s VSZ      RSS     %MEM Command
10:14:31 AM  1000     31446     66.97      0.00 34636692 18231824  13.84  java
10:14:31 AM   999     16234      0.17      0.00 5102264 4678960   3.55  redis-server
10:14:31 AM     0     19357      0.33      0.00  776200 429988   0.33  weed
10:14:31 AM     0     19174      0.25      0.00  641012 356764   0.27  weed
10:14:31 AM 10000     19855      1.31      0.00 1002612 280532   0.21  registry_DO_NOT

7、top方式查看

shift+M
ps aux --sort -%mem |lesse

二、内存测试工具Memtester

Memtester主要是捕获内存错误和一直处于很高或者很低的坏位, 其测试的主要项目有随机值,异或比较,减法,乘法,除法,与或运算等等. 通过给定测试内存的大小和次数, 可以对系统现有的内存进行上面项目的测试。

1. 在http://pyropus.ca/software/memtester/ 下载memtester-4.3.0.tar.gz;
2. 执行以下命令,安装Memtester。
tar zxvf memtester-4.2.2.tar.gz
cd memtester-4.2.2
make && make install

执行

sudo memtester 70G  5 (内存大小+次数)

三、名词概念

1、什么是进程(what is process)

       进程是操作系统提供的抽象概念,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。程序是指令、数据及其组织形式的描述,进程是程序的实体。程序本身是没有生命周期的,它只是存在磁盘上的一些指令,程序一旦运行就是进程

       操作系统对进程的控制和管理通过PCB(Processing Control Block),PCB通常是系统内存占用区中的一个连续存区,它存放着操作系统用于描述进程情况及控制进程运行所需的全部信息(进程标识号,进程状态,进程优先级,文件系统指针以及各个寄存器的内容等),进程的PCB是系统感知进程的唯一实体。

      一个进程至少具有5种基本状态:初始态、执行状态、等待(阻塞)状态、就绪状态、终止状态

2、什么是进程的生命周期(process life cycle)

       父进程复制自己的地址空间(fork)创建一个新的(子)进程结构。每个新进程分配一个唯一的进程ID(PID),满足跟踪安全性之需。PID和父进程PPID是子进程环境的元素,任何进程都可以创建子进程。子进程继承父进程的安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量,以及程序代码。随后,子进程可能exec自己的程序代码。通常,父进程在子进程运行期间处于睡眠(sleeping)状态。当子进程完成时发出(exit)信号请求,在退出时,子进程已经关闭或丢弃了其资源环境,剩余的部分称之为僵停(僵尸Zombie)。父进程在子进程退出时收到信号而被唤醒,清理剩余的结构,然后继续执行其自己的程序代码。

3、进程状态(process states)

       在多任务处理操作系统中,每个CPU(或核心)在一个时间点上只能处理一个进程。在进程运行时,它对CPU 时间和资源分配的要求会不断变化,从而为进程分配一个状态,它随着环境要求而改变,有runing、sleeping、stopped、zombie(僵尸进程)四种状态。CPU处理速度很快,看上去都像是在并发的执行多个进程,这是通过处理器在进程间切换来实现的。操作系统对把CPU控制权在不同进程之间交换执行的机制成为上下文切换(context switch),即保存当前进程的上下文,恢复新进程的上下文,然后将CPU控制权转移到新进程,新进程就会从上次停止的地方开始。因此,进程是轮流使用CPU的,CPU被若干进程共享,使用某种调度算法来决定何时停止一个进程,并转而为另一个进程提供服务。

linux上进程有5种状态:
1. 运行(正在运行或在运行队列中等待)
2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)
3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
4. 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)
5. 停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)

4、僵尸进程Zombie(有害)

       一个子进程在其父进程还没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。这是每个子进程在结束时都要经过的阶段。如果子进程在exit()之后,父进程没有来得及处理,那么此时子进程的进程控制块(PCB)仍驻留在内存中不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。

5、孤儿进程

       一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会出面处理它的一切善后工作,因此孤儿进程并不会有什么危害

6、线程

       线程也是操作系统提供的抽象概念,是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,同一进程中的多个线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈和线程本地存储

       系统利用PCB来完成对进程的控制和管理。同样,系统为线程分配一个线程控制块TCB(Thread Control Block),将所有用于控制和管理线程的信息记录在线程的控制块中,TCB中通常包括:线程标志符    一组寄存器    线程运行状态    优先级    线程专有存储区    信号屏蔽

       和进程一样,线程同样有五种状态:初始态、执行状态、等待(阻塞)状态、就绪状态和终止状态,线程之间的切换和进程一样也需要上下文切换,这里不再赘述。

7、进程 VS 线程

    进程是资源的分配和调度的独立单元。进程拥有完整的虚拟地址空间,当发生进程切换时,不同的进程拥有不同的虚拟地址空间。而同一进程的多个线程是可以共享同一地址空间

    线程是CPU调度的基本单元,一个进程包含若干线程。

    线程比进程小,基本上不拥有系统资源。线程的创建和销毁所需要的时间比进程小很多

    由于线程之间能够共享地址空间,因此,需要考虑同步和互斥操作

    一个线程的意外终止会影响整个进程的正常运行,但是一个进程的意外终止不会影响其他的进程的运行。因此,多进程程序安全性更高

8、协程

协程(Coroutine,又称微线程)是一种比线程更加轻量级的存在,协程不是被操作系统内核所管理,而完全是由程序所控制。协程与线程以及进程的关系见下图所示。

  • 协程可以比作子程序,但执行过程中,子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。协程之间的切换不需要涉及任何系统调用或任何阻塞调用

  • 协程只在一个线程中执行,是子程序之间的切换,发生在用户态上。而且,线程的阻塞状态是由操作系统内核来完成,发生在内核态上,因此协程相比线程节省线程创建和切换的开销

  • 协程中不存在同时写变量冲突,因此,也就不需要用来守卫关键区块的同步性原语,比如互斥锁、信号量等,并且不需要来自操作系统的支持。

协程适用于IO阻塞且需要大量并发的场景,当发生IO阻塞,由协程的调度器进行调度,通过将数据流yield掉,并且记录当前栈上的数据,阻塞完后立刻再通过线程恢复栈,并把阻塞的结果放到这个线程上去运行。

四、查看进程(ps和 top)

1、静态查看进程(ps)

1.1 静态查看进程 ps

# ps aux | less
USER        PID    %CPU   %MEM    VSZ      RSS    TTY      STAT    START     TIME    COMMAND
root        1       0.0    0.6   128096    6708     ?       Ss     16:20     0:01    /usr/lib/systemd/systemd
————————————————————————————
VSZ: 占用虚拟内存
RSS:  占用实际内存
TTY: 进程运行的终端   若为pts/0等,则表示由网络连接主机进程
STAT: 进程状态 man ps (/STATE)
NI 进程的NICE值,数值大,表示较少占用CPU时间;
WCHAN 当前进程是否正在進行,若为-表示正在進行;
———————————————————————————
R 运行
S 可中断睡眠 Sleep,(休眠中, 受阻, 在等待某个条件的形成或接受到信号)
D 不可中断睡眠,(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
T 停止的进程
Z 僵尸进程
X 死掉的进程
————————————————————————————
[了解]
Ss s进程的领导者,父进程
S< <优先级较高的进程
SN N优先级较低的进程
R+ +表示是前台的进程组
Sl 以线程的方式运行
L 有些页被锁进内存
s 进程的领导者(在它之下有子进程);
l 多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads);
+ 位于后台的进程组;
————————————————————————————
START: 进程的启动时间  //可以开启vim ,在用date验证。
TIME: 进程占用CPU的总时间

1.2  常用参数 ps -ef   或 ps -aux 

-a 显示终端上的所有进程
-u  以用户为主的格式来显示程序状态
-x 显示没有控制终端的进程,(显示所有程序,不以终端机来区分)
-e 显示所有进程。
-f 全格式。
-h 不显示标题。
-l 长格式。
-w 宽输出。,包括其他用户的进程。
-r 只显示正在运行的进程。

1.3 按占比升降序排列

# ps aux --sort %cpu | less      //--sort排序,升序(小到大)
# ps aux --sort -%cpu |less     //-%CPU降序(-表示降序)
# ps aux --sort rss | less    //以驻留内存升序排序
# ps aux --sort -rss  | less  

1.4 自定义显示字段

# ps axo user,pid,ppid,%mem,command   // xo指定列显示
# ps axo user,pid,ppid,%mem,command | grep httpd
  root 8310 1 0.1 /usr/sbin/httpd
  apache 8311 8310 0.0 /usr/sbin/httpd
  apache 8312 8310 0.0 /usr/sbin/httpd
  apache 8313 8310 0.0 /usr/sbin/httpd
  apache 8314 8310 0.0 /usr/sbin/httpd
  apache 8315 8310 0.0 /usr/sbin/httpd
  apache 8316 8310 0.0 /usr/sbin/httpd
  apache 8318 8310 0.0 /usr/sbin/httpd
  apache 8319 8310 0.0 /usr/sbin/httpd
  root 9236 6798 0.0 grep httpd
# ps axo user,pid,ppid,%mem,%cpu,command --sort -%cpu | less    //针对某些程序,显示某些列,再进行排序。简洁明了

1.5 查看指定进程的PID,四种方法(该处指定进程为sshd)
第一种 cat

$ cat /run/sshd.pid
830

第二种 ps

# ps aux |grep sshd
root 10180 0.0 0.0 7224 1024 ? Ss 16:00 0:00 /usr/sbin/sshd

第三种 pgrep

# pgrep -l sshd
10180  sshd
# pgrep sshd
10180

第四种  pidof

# pidof sshd
10180

top -d 1 -p 10180 (动态查看sshd的进程信息)

1.6 查看进程树 pstree -p

查看进程之间的关系,且包含应用名

$ pstree

$ pstree -p |head -n 30
systemd(1)-+-NetworkManager(3866)-+-{NetworkManager}(3957)
           |                      `-{NetworkManager}(3967)
           |-auditd(3768)---{auditd}(3769)
           |-chronyd(3840)
           |-containerd(4342)-+-containerd-shim(471)-+-weed(491)-+-{weed}(532)
           |                  |                      |           |-{weed}(533)
           |                  |                      |           |-{weed}(534)
           |                  |                      |-{containerd-shim}(472)
           |                  |                      |-{containerd-shim}(473)
           |                  |                      |-{containerd-shim}(474)
           |                  |                      |-{containerd-shim}(475)
           |                  |                      |-{containerd-shim}(476)
           |                  |                      |-{containerd-shim}(477)
           |                  |                      |-{containerd-shim}(478)
           |                  |                      |-{containerd-shim}(520)
           |                  |                      `-{containerd-shim}(531)
           |                  |-containerd-shim(1285)-+-java(1306)-+-{java}(1346

1.7  查看进程运行时间

ps -eo pid,user,lstart,etime,cmd | grep nginx

etime:衡量“挂钟时间”,现在和流程开始之间的差异,即总的运行时间。

4-21:45:32 的意思是进程运行了4天21个小时,45分钟,32秒

32-23:25:22 的意思是进程运行了32天23小时,24分钟,22秒

time:(cputime的别名)衡量CPU忙于执行流程代码的时间。当进程正在等待网络或磁盘或只是休眠时,此计数器不会增加。当进程使用多个线程并行执行某些代码时,此计数器会与占用该进程的CPU数量成比例增加。 time通常远小于etime,除非该过程进行大量计算。

lstart:显示进程的启动时间

ps -eo lstart,pid,cmd |grep nginx|grep -v grep
Fri Jun 12 18:25:09 2020 17485 nginx: worker process
Fri Jun 12 18:25:09 2020 17486 nginx: cache manager process
Wed May 27 00:14:49 2020 27921 nginx: master process /usr/local/openresty/nginx/sbin/nginx

# cat /var/run/nginx.pid
27921

# date -d "`ps -eo lstart,pid,cmd |grep 27921|grep -v grep|awk '{print $1,$2,$3,$4,$5}'`" "+%Y-%m-%d"
2020-05-27

# date -d "`ps -eo lstart,pid,cmd |grep 27921|grep -v grep|awk '{print $1,$2,$3,$4,$5}'`" "+%Y-%m-%d:%H:%M:%S"
2020-05-27:00:14:49

# date -d "`ps -eo lstart,pid,cmd |grep 27921|grep -v grep|awk '{print $1,$2,$3,$4,$5}'`" "+%s"
1590509689

2、top动态查看进程

Usage:
  top -hv | -bcHiOSs -d secs -n max -u|U user -p pid(s) -o field -w [cols]

参数说明

d 指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。
u 只查看指定用户名的进程
p 通过指定监控进程ID来仅仅监控某个进程的状态
n 设置退出前屏幕刷新的次数
b 将top输出编排成适合输出到文件的格式,可以使用这个选项创建进程日志
q 该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行
c 显示整个命令行而不只是显示命令名
S 指定累计模式
s 使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
i 使top不显示任何闲置或者僵死进程

交互命令

运行中:

在top命令执行过程中可以使用的一些交互命令,如果在命令行选项中使用了s选项,则可能其中一些命令会被屏蔽掉。
Shift+n    按PID排序
Shift+p    按CPU排序
Shift+m    按内存使用排序
Shift+t    按CPU用时排序
Shift+</Shift+>    按左边下一列排序/按右边下一列排序

运行前:

u 输入用户名只显示指定用户的进程
n 键入数字可查看指定数量的进程,任意时刻按=即可回复最初的top显示
k 终止一个进程。系统将提示用户输入需要终止的进程PID,以及需要发送给该进程什么样的信号。一般的终止进程可以使用15信号;如果不能正常结束那就使用 信号9强制结束该进程。默认值是信号15。在安全模式中此命令被屏蔽
i 忽略闲置和僵死进程。这是一个开关式命令。
r 重新安排一个进程的优先级别。系统提示用户输入需要改变的进程PID以及需要设置的进程优先级值。输入一个正值将使优先级降低,反之则可以使该进程拥有更高的优先权。默认值是10。
S 切换到累计模式。
s 改变两次刷新之间的延迟时间。系统将提示用户输入新的时间, 单位为s。如果有小数,就换算成ms。输入0值则系统将不断刷新,默认值是5s。需要注意的是如果设置太小的时间,很可能会引起不断刷新,从而根本来不及看清显示的情况,而且系统负载也会大大增加。
d 功能同上
f或者F 从当前显示中添加或者删除项目。
o 或者O 改变显示项目的顺序。
l 切换显示平均负载和启动时间信息。
m 切换显示内存信息。
t 切换显示进程和CPU状态信息。
c 切换显示命令名称和完整命令行。
M 根据驻留内存大小进行排序。
P 根据CPU使用百分比大小进行排序。
T 根据时间/累计时间进行排序。
W 将当前设置写入~/.toprc文件中。

示例

只查看有效用户名为mysql的进程

top -u MySQL 

只查看进程200和2000

top -p 200,2000

以非交互和非全屏模式运行

top -b   

运行top并记录命令输出,时长10小时,保存到plog文件

top -b -n 12000 > plog 

top -bi -n 120
top - 19:29:48 up 65 days,  4:22,  1 user,  load average: 3.23, 3.25, 3.26
Tasks: 619 total,   2 running, 617 sleeping,   0 stopped,   0 zombie
%Cpu(s):  2.9 us,  7.0 sy,  0.0 ni, 87.4 id,  0.3 wa,  0.0 hi,  2.4 si,  0.0 st
KiB Mem : 13173580+total,   585648 free, 44998056 used, 86152104 buff/cache
KiB Swap:  4194300 total,  3417084 free,   777216 used. 85298192 avail Mem

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 4828 root      20   0 1351368   6136    936 R 200.0  0.0 116461:32 docker-proxy
20274 root      20   0   43.8g  11.1g   7408 S 125.0  8.9  73945:03 java
 5157 polkitd   20   0 8465208   3656   1168 S  87.5  0.0  58938:57 redis-server
12021 op_admin  20   0  172736   2696   1576 R  18.8  0.0   0:00.03 top
    9 root      20   0       0      0      0 S   6.2  0.0 162:22.28 rcu_sched
 5503 root      20   0  613292   7200   3104 S   6.2  0.0 761:41.14 envoy

使top不显示任何闲置或者僵死进程,实用

top -id 1

2.1上半部分:

第一部分:系统整体统计信息
top - 11:45:08 up 18:54,  4 users,  load average: 0.05, 0.05, 0.05 
//当前时间;系统运行时间,时:分;当前登录用户数;系统负载,即任务队列的平均长度。三个数值分别为1分钟 、5分钟 、15分钟
Tasks: 176 total,   1 running, 175 sleeping,   0 stopped,   0 zombie  %Cpu(s):  0.0 us,  0.3 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

total 进程总数   running 正在运行的进程数    sleeping 睡眠的进程数    stopped 停止的进程数    zombie 僵尸进程数
Cpu(s):
 us 用户空间占用CPU百分比
 sy 内核空间占用CPU百分比
 ni 用户进程空间内改变过优先级的进程占用CPU百分比
 id 空闲CPU百分比
 wa  CPU 等待磁盘或其他 I/O 操作完成的时间百分比
 hi:硬件CPU中断占用百分比
 si:软中断占用百分比
 st:虚拟机占用百分比
KiB Mem :  3865520 total,  1100000 free,   580268 used,  2185252 buff/cache
KiB Swap:  4063228 total,  4063228 free,        0 used.  2917828 avail Mem (avail Mem表示可用于进程下一次分配的物理内存数量,这个大小一般比free大一点,因为除了free的空间外,系统还能立即释放出一些空间来。)

负载加权值解释:小于1正常
load average: 0.86, 0.56, 0.78 系统最近 1分钟,5分钟,15分钟平均负载

关于buffers的小实验:做个小实验,观察缓存的作用。
  time cp -rf /etc /tmp/etc1
  time cp -rf /etc /tmp/etc1
  注意观察两次复制的时间,大大缩小,是因第二次的数据已经到了buffer了。在top的buffer/cache会有体现。

补充:

I/O 等待和 CPU 负载的关系

  • I/O 等待 (wa) 高导致 CPU 负载上升

    1. 磁盘读写高:当系统执行大量磁盘读写操作时(如数据密集型应用程序、数据库操作、日志写入等),磁盘 I/O 子系统可能会成为瓶颈。
    2. 等待时间增加:CPU 花费更多时间等待磁盘 I/O 操作完成,即 wa 增加。
    3. CPU 负载上升:尽管 CPU 主要处于等待状态,系统总体负载(包括 CPU 负载)会上升,因为负载统计包含了等待 I/O 的时间。
    4. 其他资源饥饿:高 I/O 等待时间可能导致其他任务获取不到资源,导致整体系统性能下降。
  • CPU 负载高导致 wa 升高
    通常,纯粹的 CPU 高负载(如复杂计算、密集型任务)不会直接导致 wa 增加。wa 增加通常与 I/O 子系统的瓶颈存在。

总结来说:磁盘读写高是导致 wa 升高的直接原因,而不是 CPU 负载高导致 wa 升高。当然,两者可能同时存在于高负载系统中,但原因和现象有所不同

2.2下半部分:

字段介绍

虚拟内存(VIRT):virtual memory usage :(1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等2、假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量需要这些内存,但并没有占满。)

常驻内存(RES):resident memory usage :(1、进程当前使用的内存大小 2、包含其他进程的共享 3、如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反用了多少内存)。

共享内存(SHR):shared memory:(1、除了自身进程的共享内存,也包括其他进程的共享内存  2、计算某个进程所占的物理内存大小公式:RES – SHR)

2.3 进程信息

h|?帮助
M 按内存的使用排序
P 按CPU使用排序
N 以PID的大小排序
R 对排序进行反转
f 自定义显示字段
1 显示所有CPU的负载
< 向前
> 向后
z 彩色,Z设置彩色,使用数字调整
W 保存top环境设置

2.4信号种类

kill -9 pid   强制杀死

kill -1 pid  重新加载配置,进程不会死 等效于kill -HUP

kill -15 pid   正常结束

kill -18 pid 继续

kill -19 pid 停止

五、nice优先级设置(人为可设置nice范围-20到19)

法一 :nice -n -5 sleep 6000 &

发二  :top -d 1 -p pid

按r键 //调整进程的优先级(Nice Level) (-20高) ---0--- (19低)(直接回车)
回车 //确认该程序。
-20
回车  //确认修改nice值。
如果直接使用top,使用R调整nice值,先输入PID,再输入nice值即可。

法三:renice -20 pid

六、杀死僵尸进程

僵尸进程产生的原因?

1、子进程结束后向父进程发出SIGCHLD信号,父进程默认忽略了它
2、父进程没有调用wait()或waitpid()函数来等待子进程的结束
3、网络原因有时会引起僵尸进程;

如何杀死僵尸进程?
       僵尸进程用kill命令是无法杀掉的,但是可以杀掉僵尸进程的父进程ppid,僵尸ppid挂了之后,僵尸进程就成了孤儿进程,孤儿进程不会占用系统资源,会被init程序收养,然后init程序将其回收。

查看具体僵尸进程:

ps -A -o stat,ppid,pid,cmd |grep -e "^[Zz]"   ps自定义组合输出内容,grep -e 只传递一个参数

-A 参数列出所有进程
-o 自定义输出字段 我们设定显示字段为 stat(状态), ppid(进程父id), pid(进程id),cmd(命令)这四个参数
因为状态为 z或者Z的进程为僵尸进程,所以我们使用grep抓取stat状态为zZ进程 

杀僵尸进程的流程

1.查看所有R相关的进程(R是一个具体的僵尸进程,defunct就是zombie)

2.查看僵尸进程的父进程

3.杀死僵尸进程对应的父进程

4.僵尸进程被回收(top 查看僵尸进程总数为0)

top查看僵尸进程的总数,另外按1可显示所有的cpu核数

一条简单的命令,直接查找僵死进程,然后将父进程杀死

ps -A -o stat,ppid,pid,cmd | grep -e  '^[Zz]' | awk  '{print $2}' | xargs kill -9

ps -eo ppid,stat | grep Z | cut -d” ” -f2 | xargs kill -9

kill -HUP  $(ps -A -ostat,ppid | grep -e  ’^[Zz]‘ | awk  ’{print $2}’)  

ps -eal | awk '{ if ($2 == "Z") {print $4}}' | kill -9

kill -HUP:

想要更改配置而不需停止并重新启动服务,则使用该命令。在对配置文件作必要的更改后,发出该命令以动态更新服务配置

如重启Nginx:
   # kill -HUP `cat /app/nginx/nginx.pid`

七、进程通信方式

1.管道

管道分为有名管道和无名管道

无名管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系一般指的是父子关系。无明管道一般用于两个不同进程之间的通信。当一个进程创建了一个管道,并调用fork创建自己的一个子进程后,父进程关闭读管道端,子进程关闭写管道端,这样提供了两个进程之间数据流动的一种方式。

有名管道也是一种半双工的通信方式,但是它允许无亲缘关系进程间的通信。

2.信号量

信号量是一个计数器,可以用来控制多个线程对共享资源的访问.,它不是用于交换大批数据,而用于多线程之间的同步.它常作为一种锁机制,防止某进程在访问资源时其它进程也访问该资源.因此,主要作为进程间以及同一个进程内不同线程之间的同步手段.

Linux提供了一组精心设计的信号量接口来对信号进行操作,它们不只是针对二进制信号量,下面将会对这些函数进行介绍,但请注意,这些函数都是用来对成组的信号量值进行操作的。它们声明在头文件sys/sem.h中。

semget函数

它的作用是创建一个新信号量或取得一个已有信号量

semop函数

它的作用是改变信号量的值

semctl函数

该函数用来直接控制信号量信息

3.信号

信号是一种比较复杂的通信方式,用于通知接收进程某个事件已经发生.

4.消息队列

消息队列是消息的链表,存放在内核中并由消息队列标识符标识.消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等特点.消息队列是UNIX下不同进程之间可实现共享资源的一种机制,UNIX允许不同进程将格式化的数据流以消息队列形式发送给任意进程.对消息队列具有操作权限的进程都可以使用msget完成对消息队列的操作控制.通过使用消息类型,进程可以按任何顺序读信息,或为消息安排优先级顺序.

5.共享内存

共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问.共享内存是最快的IPC(进程间通信)方式,它是针对其它进程间通信方式运行效率低而专门设计的.它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步与通信.

6.套接字

socket,即套接字是一种通信机制,凭借这种机制,客户/服务器(即要进行通信的进程)系统的开发工作既可以在本地单机上进行,也可以跨网络进行。也就是说它可以让不在同一台计算机但通过网络连接计算机上的进程进行通信。也因为这样,套接字明确地将客户端和服务器区分开来。

套接字的特性由3个属性确定,它们分别是:域、类型和协议。

可用于不同及其间的进程通信

 

 

 

https://mp.weixin.qq.com/s/DI1E250H9w1WMiBeq0yzIg



posted @ 2019-07-22 21:15  凡人半睁眼  阅读(1568)  评论(0编辑  收藏  举报