zoukankan      html  css  js  c++  java
  • 19、进程

    1.进程基本概述

    当我们运行一个程序,那么我们将运行的程序叫进程。
    PS1: 当程序运行为进程后,系统会为该进程分配内存,以及进程运行的身份和权限。
    PS2: 在进程运行的过程中,服务器上会有各种状态来表示当前进程的指标信息。

    2.程序和进程的区别

    1.程序是数据和指令的集合,是一个静态的概念。比如/bin/ls、/bin/cp等二进制文件。同时程序可以长期存在系统中。
    2.进程是程序运行的过程,是一个动态的概念。进程是存在生命周期的概念的,也就是说进程会随着程序的终止而销毁,不会永久存在系统中。

    3.进程的生命周期

    生命周期就是指一个对象的生老病死。用处很广。

    4.监控进程状态

    4.1.使用ps命令查看当前的进程状态(静态)

    状态 描述
    USER 启动进程的用户
    PID 进程运行的ID号
    %CP 进程占用CPU百分比
    %MEM 进程占用内存百分比
    VSZ 进程占用虚拟内存大小 (单位KB)
    RSS 进程占用物理内存实际大小 (单位KB)
    TTY 进程是由哪个终端运行启动的tty1、pts/0等
    ? 表示内核程序与终端无关
    STAT 进程运行过程中的状态 man ps (/STATE)
    START 进程的启动时间
    TIME 进程占用 CPU的总时间(为0表示还没超过秒)
    COMMAND 程序的运行指令,[ 方括号 ]属于内核态的进程。 没有 [ ] 的是用户态进程。

    4.2.STAT基本状态

    STAT基本状态 描述 STAT状态+符号 描述
    R 进程运行 s 进程是控制进程, Ss进程的领导者,父进程
    S 可中断睡眠 < 进程运行在高优先级上,S<优先级较高的进程
    T 进程被暂停 N 进程运行在低优先级上,SN优先级较低的进程
    D 不可中断进程 + 当前进程运行在前台,R+该表示进程在前台运行
    Z 僵尸进程 l 进程是多线程的,Sl表示进程是以线程方式运行

    4.3.案例一、PS命令查看进程状态切换

     #1.在终端1上运行vim
     [root@xuliangwei ~]# vim oldboy
    
     #2.在终端2上运行ps命令查看状态
     [root@xuliangwei ~]# ps aux|grep oldboy #S表示睡眠模式,+表示前台运行
     root 58118 0.4 0.2 151788 5320 pts/1 S+ 22:11 0:00 oldboy
     root 58120 0.0 0.0 112720 996 pts/0 R+ 22:12 0:00 grep --color=auto oldboy
     #在终端1上挂起vim命令,按下:ctrl+z 
    
     #3.回到终端2再次运行ps命令查看状态
     [root@xuliangwei ~]# ps aux|grep oldboy #T表示停止状态
     root 58118 0.1 0.2 151788 5320 pts/1 T 22:11 0:00 vim oldboy
     root 58125 0.0 0.0 112720 996 pts/0 R+ 22:12 0:00 grep --color=auto oldboy

    4.4.案例二、PS命令查看不可中断状态进程

     #1.使用tar打包文件时,可以通过终端不断查看状态,由S+,R+变为D+
     [root@xuliangwei ~]# tar -czf etc.tar.gz /etc/ /usr/ /var/
    
     [root@xuliangwei ~]# ps aux|grep tar|grep -v grep
     root 58467 5.5 0.2 127924 5456 pts/1 R+ 22:22 0:04 tar -czf etc.tar.gz /etc/ 
     [root@xuliangwei ~]# ps aux|grep tar|grep -v grep
     root 58467 5.5 0.2 127088 4708 pts/1 S+ 22:22 0:03 tar -czf etc.tar.gz /etc/ 
     [root@xuliangwei ~]# ps aux|grep tar|grep -v grep
     root 58467 5.6 0.2 127232 4708 pts/1 D+ 22:22 0:03 tar -czf etc.tar.gz /etc/ 

    4.5.查看负载

    [root@oldboy ~]# w
     19:05:48 up 1 day, 11 min, 3 users, load average: 0.00, 0.01, 0.05
    
    [root@oldboy ~]# uptime
     19:06:16 up 1 day, 12 min, 3 users, load average: 0.00, 0.01, 0.05
    
    [root@oldboy ~]# top 
    19:01:10 up 1 day, 7 min, 3 users, load average: 0.00, 0.01, 0.07
    Tasks: 189 total, 1 running, 187 sleeping, 1 stopped, 0 zombie

    4.6.top查看出的名词含义

    任务 含义
    Tasks: 129 total 当然进程的总数
    1 running 正在运行的进程数
    128 sleeping 睡眠的进程数
    0 stopped 停止的进程数
    0 zombie 僵尸进程数
    %Cpu(s): 0.7 us 系统用户进程使用CPU百分比
    0.7 sy 内核中的进程占用CPU百分比,通常内核是于硬件进行交互
    0.0 ni 改变过优先级的进程占用CPU的百分比
    98.7 id 空闲CPU的百分比
    0.0 wa IO等待占用CPU的百分比
    0.0 hi 硬中断,占的CPU百分比(扩展)
    0.0 si 软中断,占的CPU百分比(扩展)
    0.0 st 比如虚拟机占用物理主机CPU的时间

    所以,这两个阶段你也可以这样理解:
    上半部直接处理硬件请求,也就是我们常说的硬中断,特点是快速执行;

    而下半部则是由内核触发,也就是我们常说的软中断,特点是延迟执行。

    f: 经常听同事说大量的网络小包会导致性能问题,为什么呢?
    q:因为大量的网络小包会导致频繁的硬中断和软中断?
    所以大量网络小包传输很慢,但如果将网络包一次传递,是不是会快很多呢?

    https://www.cnblogs.com/xuliangwei/p/10789270.html

    4.7.top命令使用下面参数则会显示不同效果

    字母 含义
    h 查看帮出
    1 数字1,显示所有CPU核心的负载
    z 以高亮显示数据
    b 高亮显示处于R状态的进程
    M 按内存使用百分比排序输出
    P 按CPU使用百分比排序输出
    q 退出top

    4.8.top中第六行的释义

    PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
    进程id 进程所有者 优先级 nice值。负值表示高优先级,正值表示低优先级 进程使用的虚拟内存总量 进程使用的、未被换出的物理内存大小 共享内存大小 进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程) 上次更新到现在的CPU时间占用百分比 进程使用的物理内存百分比 进程使用的CPU时间总计,单位1/100秒 命令名/命令行

    https://www.cnblogs.com/zhoug2020/p/6336453.html

    5.管理进程状态

    管理进程: Kill pkill killall

    数字编号 信号含义 信号翻译
    1 SIGHUP 通常用来重新加载配置文件
    9 SIGKILL 强制杀死进程
    15 SIGTERM 终止进程,默认kill使用该信号

    当进程没有停止的信号,可以使用系统的kill给进程发送信号

    默认kill掉进程的父进程,这样才能彻底的杀掉该进程. 否则如果只是kill子进程,没有用
    [root@oldboy ~]# kill 18788
    
    重载配置,PID号不会发生变化. 只要PID发生变化说明进程被停止过
    [root@oldboy ~]# kill -1 20154
    
    强制杀死某个进程.慎用
    [root@oldboy ~]# kill -9 20154
    
    批量杀死进程
    [root@oldboy ~]# ps aux|grep nginx |grep -v grep|awk '{print $2}'|sed -r 's#(.*)#kill 1#g'|bash
    [root@oldboy ~]# killall nginx 跟进程的名称(批量)
    [root@oldboy ~]# pkill nginx 跟上进程名称(批量)
    [root@oldboy ~]# pkill -9 -t pts/0 杀掉连接的终端

    6.管理后台进程

    ==后台进程:screen==

    1.再开启一个子bash窗口,关闭父bash并不影响子bash
    
    1.安装
    [root@oldboy ~]# yum install screen -y
    
    2.开启一个screen窗口,指定名称
    [root@oldboy ~]# screen -S wget_mysql
    
    3.在screen窗口中执行任务即可
    
    4.平滑的退出screen,但不会终止screen中的任务   注意: 如果使用exit 才算真的关闭screen窗口
    ctrl+a+d
    
    5.查看当前正在运行的screen有哪些
    [root@oldboy ~]# screen -list
    There is a screen on:
     22058.wget_mysql   (Detached)
    1 Socket in /var/run/screen/S-root.
    
    6.进入正在运行的screen
    [root@oldboy ~]# screen -r wget_mysql
    [root@oldboy ~]# screen -r 22058

    7.进程的优先级[进阶]

    7.1.进程优先级: nice renice

    nice 值越高:表示优先级越低,例如+19,该进程容易将CPU 使用量让给其他进程。
    nice 值越低:表示优先级越高,例如-20,该进程更不倾向于让出CPU。
    NI: 实际nice级别,默认是0。PR:显示nice值,-20映射到0,19映射到39

    7.2.nice指定程序的优先级。

    语法格式 nice -n 优先级数字 进程名称

     #1.开启vim并且指定程序优先级为-5
     [root@m01 ~]# nice -n -5 vim &
     [1] 98417
    
     #2.查看该进程的优先级情况
     [root@m01 ~]# ps axo pid,command,nice |grep 98417
      98417 vim -5

    7.3.renice命令修改一个正在运行的进程优先级。

    语法格式 renice -n 优先级数字 进程pid

     1.查看sshd进程当前的优先级状态
     [root@m01 ~]# ps axo pid,command,nice |grep [s]shd
      70840 sshd: root@pts/2 0
      98002 /usr/sbin/sshd -D 0
    
     2.调整sshd主进程的优先级
     [root@m01 ~]# renice -n -20 98002
     98002 (process ID) old priority 0, new priority -20
    
     3.调整之后记得退出终端
     [root@m01 ~]# ps axo pid,command,nice |grep [s]shd
      70840 sshd: root@pts/2 0
      98002 /usr/sbin/sshd -D -20
     [root@m01 ~]# exit
    
     4.当再次登陆sshd服务,会由主进程fork子进程(那么子进程会继承主进程的优先级)
     [root@m01 ~]# ps axo pid,command,nice |grep [s]shd
      98002 /usr/sbin/sshd -D -20
      98122 sshd: root@pts/0 -20

    案例: Linux假死

    8.系统平均负载[进阶]

    平均负载: mpstat pidstat

    如何理解平均负载:平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数,
    PS: 平均负载与 CPU 使用率并没有直接关系。

    划重点,因此你可以简单理解为,平均负载其实就是单位时间内的活跃进程数。

    那么在实际生产环境中,平均负载多高时, 65%-70%

    场景一:CPU 密集型进程
    [root@oldboy ~]# stress --cpu 4 --timeout 600 
    
    [root@oldboy ~]# watch -d uptime
    [root@oldboy ~]# mpstat -P ALL 5
    [root@oldboy ~]# pidstat -u 5 1
    
    场景二:I/O 密集型进程
    [root@m01 ~]# stress --io 1 --timeout 600s
    
    场景三:大量进程的场景
    [root@m01 ~]# stress -c 4 --timeout 600
    
    平均负载提供了一个快速查看系统整体性能的手段,反映了整体的负载情况。  
    但只看平均负载本身,我们并不能直接发现,到底是哪里出现了瓶颈。
    
    所以,在理解平均负载时,也要注意:
     平均负载高有可能是 CPU 密集型进程导致的;
     平均负载高并不一定代表 CPU使用率高,还有可能是 I/O 繁忙了;
     当发现负载高的时候,你可以使用 mpstat、pidstat 等工具,辅助分析负载的来源
    
    如果出现无法使用mpstat、pidstat命令查看%wait指标建议更新下软件包
    wget http://pagesperso-orange.fr/sebastien.godard/sysstat-11.7.3-1.x86_64.rpm
    rpm -Uvh sysstat-11.7.3-1.x86_64.rpm

    stress介绍





  • 相关阅读:
    获取指定位置的颜色值
    《QTP自动化测试进阶》读书笔记
    Delphi自动化测试
    QTP中DOM的递归调用取html页面值
    PowerShell
    Dictionary对象与XML文件之间的导入导出
    BPT业务流程自动化测试
    VisualStudio 自动化测试框架 Coded UI Test
    使用QTP查找邮件
    QTP11视频
  • 原文地址:https://www.cnblogs.com/Forever-x/p/d34f2bd0e62002be53a7b7a0879d8ea5.html
Copyright © 2011-2022 走看看