Linux进程查看与管理

静态结构:重底层开始往上

    底层:硬件

    kernel(OS):各硬件接口封装成简洁的接口

    库:将内核功能封装成功能模块,供程序员研发使用

    OS的基本功能:文件系统、网络功能、进程管理、内存管理、驱动程序、安全功能

动态结构:重底层开始往上

    底层:bios,

    内核:通过BTR启动内核程序

    程序:程序=指令+数据;

        CPU:特权指令(系统调用);普通指令

        程序执行环境:内核模式:运行内核级指令

      用户模式:运行普通指令

        应用程序:运行普通指令:直接运行于CPU

  运行特权指令:通过system call

        进程:运行中的程序,运行在自己专有的内存空间

        内存:cpu在内存中取数据;存指令;存数据;程序运行于内存空间;

        内存空间:物理内存映射到逻辑内存,编程中在逻辑内存做个假设,在映射到物理内存来。在逻辑内存中的连续数据可能到物理内存页框中可能就不连续存储。   

        地址空间:物理地址空间;线性地址空间

        线性地址空间:每一个内存都运行在自己的逻辑空间,然后要映射到物理内存空间。每一个进程的线性地址空间,都遵循一定的规范;在最底端是指令且是只读的,接着初始值为零和不为零的数据;接着是堆和栈,对内存的实时调取。

        32bits: 2^32, 0-2^32-1, 2^10*2^10*2^10*2^2 bytes = 2^10*2^10*2^2 kilo bytes = 2^10*2^2 MB = 4GB

        64bits: 2^64, 4billions 4G

        4G空间分配: 1G, kernel;3G(2.7G), app


进程创建:每一进程是有他的父进程fork()创建而来;

    parent(进程)-----> fork()----->child;子进程发起fork调用,创建复制fork的子进程,且共同使用同一个内存地址空间。

    COW: Copy On Writing写时复制;当子进程要修改进程的数据时,新建一个复制fork的进程,使用自己的地址空间。

进程:fork(), clone()


COW: Copy On Writing

写时复制

进程回收:销毁进程使用destroy


进程追踪:内核内存空间中,创建task struct(任务结构)。

    task struct: 用于保存每个进程元数据信息。

        例如:pid, ppid, memory, thread, files


进程调度:cpu通常只能跑一个进程,其他进程等待。


进程的上下文切换:进程按照固定时间轮询,中间结果如何都会存入自己内核的task struct(任务结构)中。下次运行时,直接从自己内核的task struct(任务结构)中上次暂停的地方调用(相当于挂起,重新载入)。


进程优先级:140个,0-139

    1-99:实时优先级,数字越大优先级越高

    100-139:数字越小,优先级越高;    静态优先级;动态优先级;   



多任务:多进程同时运行;抢占式多任务


算法时间复杂度:Big O衡量

    O(1)

    O(logn)

    O(n)

    O(n^2)

    O(2^n)


进程分类:

    CPU bound: CPU密集型

    I/O bound: IO密集型


进程的状态:

    运行态:running

    睡眠态:sleeping

        可中断睡眠:interruptible,随时唤醒到cpu

        不可中断睡眠: uninterruptible,被IO阻塞的进程,等待磁盘调用完毕才能执行

    就绪态:runnable

    停止态:stopped,不可被调度为运行状态;

    僵死态:zombie,父进程意外中止,子进程还运行,一般会指定init或systemctl


线程:tread,并行编程模式。一个进程内部自我管理执行的多个执行流。将多个执行流运行在一个CPU上的多个内核上。


LWP:Light Weight Process;对于linux,线程就是进程,进程也是线程。


Linux进程查看及管理工具:top, pstree, ps, pidof, pgrep, pkill, htop, glances, pmap, vmstat, dstat, iostat, sar, kill, job, bg, fg


命令:

pstree:进程树查看;

    -p: 显示各进程的PID;

wKiom1YI9dfjQrnMAAM5W7dRYng777.jpg


ps: process state

    Linux运行中的内核的相关信息是通过/proc伪文件系统输出的;各进程都有一个以其PID命名的子目录,每个子目录中有许多文件存储了进程的相关状态信息;

    显示的是ps命令执行时,系统上当前进程状态信息的快照;所以,为静态结果;

    根据进程启动时是否是通过终端上的用户接×××互式启动的,进程可分为两类:

        与终端相关的进程: a

        与终端无关的进程: x

        以用户为中心组织进程状态信息显示:u

    支持众多选项:BSD风格; SysV风格,-引导

    

    常用选项组合1:axu

    USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND

wKiom1YI94iQEvTZAAL-qGMSf_E693.jpg    

    VSZ: Virtual memory Size;线性地址空间占用的空间大小;

    RSS:常用驻内存集;指不可以被交换至swap空间的数据占据空间大小; 

    STAT:进程状态

        R: running,运行状态;

        S:interruptible sleeping,可中断睡眠

        D:uniterruptible sleeping, 不可中断睡眠

        T: stopped

        Z: zombie

        

        s: session leader;

        +: 前台进程,占据着某终端

        l: 多线程进程

        <: 高优先级进程

        N: 低优先级进程

        

        START: 启动时间

        TIME: 占据CPU累积时长

        COMMAND: 启动当前进程或线程的命令行程序,[]表示为内核线程;

    

    常用选项组合2: -ef

        -e: 显示所有进程;

        -f: 显示丰富格式信息

    

    常用选项组合3:-eFH

    -F: 显示额外信息

    -H: 以层级形式显示进程间关系;

wKioL1YI-UeQve7WAAI34wH_GqE264.jpg

    

    自定义需要显示的信息:axo

    ps axo pid,command,psr,pri,ni

    psr: 当前进程运行的CPU编号;

    pri: 当前进程的优先级;

    ni: 当前进程的nice值;

    -20, 19

wKioL1YI-d7w5CKeAAIzFA5KI7Y678.jpg


pgrep: 

    语法格式:pgrep [OPTIONS] "PATTERN"

    -U UID:仅显示以指定用户身份运行的进程;

    -G GID

    -l: 显示PID和进程名;

wKiom1YI_EyjEe4VAAFipgVT22c039.jpg    


pidof: 

    pidof PROGRAM

    PROGRAM: 给定命令行程序

wKioL1YI_RKgllQpAADusl17puM158.jpg



top命令:

wKioL1YI_m6DUh8xAAQdaE-N0jc386.jpg

    有许多交互式的子命令;

    P:以占据的CPU百分比大小排序;

    M:以占据Memory空间大小排序;

    T:CPU累积占用时间排序;

    

    l: 是否显示系统负载行;

    队列长度的合理区间:CPU颗数*0.7

    t: 是否显示进程摘要信息及CPU负载状态;

    Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

        us: user space

        sy: system (kernel space)

        ni: nice

        id: idle

        wa: wait io

        hi: hardware interrupt

        si: software interrupt

        st: stolen, 被虚拟机“偷走”的百分比

    1:平均或单独显示CPU的负载状态;

    m: 是否显示内存相关的状态信息;

    

    q: 退出命令

    s: 修改延迟时长

    k: 终止指定进程

    

    top命令的选项:

    -b: batch,批次显示

    -n #: 显示的批次数量

    -d #: 指明延迟时长

    

uptime命令: 显示当前系统时间,运行时长,登录用户数及系统平均负载;

wKiom1YI_jSj5N2YAACIKd1E8-w584.jpg


htop: 

    u: 过滤仅显示选定用户的进程;

    s: 跟踪选定的进程所发起的系统调用;

    l: 显示选定进程所打开的文件;

    t: 显示进程的层次结构;

    a: 设定进程的cpu亲缘性;(将选定的进程绑定在指定的CPU上)

    

    选项:

    -d #: 延迟时长

    -u USERNAME: 仅显示指定用户的进程;

    -s COLUMN: 根据指定的字段进行排序;

wKiom1YJYDTggoBaAAbTUG4qU5o386.jpg

wKiom1YKAz7iAH06AANygLv8PNU922.jpg



vmstat命令:

    用法:vmsate [delay [count]]

wKiom1YKCLnj2rLNAAN-iWJqY7g789.jpg        procs:

    r: 等待运行的进程的个数;(队列长度,每颗CPU的每个核心2-3个以内)

    b:处理不可中断睡眠状态的进程的个数;(即IO阻塞队列长度)

      

    memory:

    swpd: 交换内存使用量;

    free: 空间的物理内存量;

    buffer: 用于buffer的内存总量;

    cache: 用于cache的内存总量;

      

    swap:

    si: 数据进入swap中的速率(kb/s)

    so: 数据离开swap的速率(kb/s)

      

    io

    bi: 从块设备读入数据到系统的速率(kb/s)

    bo: 保存数据至块设备的速率(kb/s)

      

    system

    in: 中断速率

    cs: 进程切换的速率

      

    cpu 

    us: userd

    sy:system

    id:idel

    wa:wait

    st:stop

注意: wait过高,因为io速度不好,磁盘速率太慢;system过高,程序写的有问题。

    选项:

    -s:显示内存的状态统计数据

wKioL1YKJiKj18ZKAAGonqhPicg489.jpg      

/proc/#接口:

wKioL1YKJt7SdYWfAAJ8UC4H-C8161.jpg

   

 pmap: 查看指定进程的内存映射关系;

      pmap [OPTIONS] pid...


wKiom1YKJzfz-JdBAAPV3flh0zk159.jpg

wKiom1YKJ1XDSN7FAAOP5PxdzJc365.jpg


glances: 

      glances [-bdehmnrsvyz1] [-B bind] [-c server] [-C conffile] [-p port] [-P password] [--password] [-t refresh] [-f file] [-o output]

      

    常用选项:

    -b: 以Byte/s为单位显示网卡设备数据交换速率;

    -d: 关闭磁盘I/O功能模块;

    -f /PATH/TO/SOMEFILE:设置输出文件的位置及格式;

    -o {HTML|CSV}:

    -m: 关闭mount功能模块

    -n: 关闭网络功能模块

    -r: 关闭进程列表功能模块

    -t #: 指定延迟时长,默认为3秒;

    -1:单独显示每颗CPU相关负载数据信息;

    glances支持远程模式:

     即可以以C/S模式工作:

     Server: 以监听模式启动glances;

     Client: 以远程模式启动glances,远程连入指定服务器,并Server上的相关性能数据;

     

     服务模式:

   glances -s -B IPADDR

     -B: 用于指明监听的本地地址;

     

     客户端模式:

   glances -c IPADDR

     -c: 用于连入的服务器的地址;

wKiom1YKKWDgM6iYAAQIn-710JM174.jpg   

    

dstat: 整合了vmstat, iostat, netstat and ifstat四款工具的功能;

      dstat [-afv] [options..] [delay [count]]

wKiom1YKLh_SN-_QAALpr2-ImWk264.jpg          -a: -cdngy

    -c: 显示cpu性能指标相关的统计数据;

    -d: 显示disk相关的速率数据;

    -g: 显示page相关的速率数据;

    -i: 显示interrupt相关的速率数据;

    -l: 显示load average相关的统计数据;

    -m: 显示memory相关的统计数据;

    -n: 显示网络收发数据的速率;

    -p: 显示进程相关的统计数据,

    -r: io请求的速率;

    -s: 显示swap的相关数据

    -y: 显示系统相关的数据,包括中断和进程切换;

wKiom1YKL_7DB6S7AADeFHI7KO8401.jpg    

    --top-cpu:显示最占用CPU的进程;

    --top-bio:显示最消耗block io的进程;

    --top-io:最占用io的进程;

    --top-mem:显示最占用内存的进程;

wKioL1YKL2ugSgyvAAGTVqQr7xc410.jpg    

    --ipc: 显示进程间通信相关的速率数据;

    --raw: 显示raw套接的相关的数据;

    --tcp: 显示tcp套接字的相关数据;

    --udp: 显示udp套接字的相关数据;

    --unix: 显示unix sock接口相关的统计数据;

    --socket: 

wKioL1YKMOvCLZirAADG9kH5VOA990.jpg    

    

signal: 传递给进程的短小信息

    Linux主机支持的进程间可用到的信息:

    (1) kill -l

    (2) man 7 signal

wKiom1YKMWWx6dEgAAJCw1xhkUc357.jpg    

    向进程发信号:

    kill [-SIGNAL] PID 

    默认的信号为SIGTERM;

    

    信号表示方式:

    (1) 完整名称,例如SIGINT

    (2) 简写名称,例如INT

    (3) 数据代称,例如2

    常用信号:

    SIGHUP: 1, 通知进程重读其配置文件以让新的配置生效,但不用重新启动进程;

    SIGINT:2, 打断正在运行中的进程,相当于键盘组合键Ctrl+c

    SIGKILL:9, 强行中止正在运行中的进程

    SIGTERM: 15, 安全中止正在运行中的进程

    SIGSTOP: 19, 暂停进程

    SIGCONT: 18, 继续运行指定进程

wKioL1YKMnWCtIDFAAG1AIc-sBw876.jpg  

wKiom1YKMqPQSBmXAAHJWC64se0859.jpg  

    

killall相似的一组进程:

       killall [-SIGNAL] PROGRAM

wKiom1YKM8mSnTFEAAJGKxCu4hw566.jpg    

wKioL1YKM-_iEz_NAAF2bWD_pYM373.jpg


作业管理:

前台作业:通过终端启动,并且在停止之前也会一直占据终端;

后台作业:作业启动之时与终端无关,或者是在前台启动,但启动后转为与终端无关模式运行;

如何让作业运行于后台?

   1、对于已经启动并处于运行中的作业:

     Ctrl+z

注意: 作业被送往后台后,默认处于stopped状态;

   2、对于尚未启动的作业:

     COMMAND &

注意: 此两类方式相关作业,仍然与终端相关;这意味着,终端终止,将会导致与此终端相关的所有作业被终止;

   

   3、剥离进程与终端的关系:

     # nohup COMMAND &

  

作业查看:

 jobs命令

   作业号、作业状态、启动命令行程序

wKioL1YKOM3yI4wHAABw71BFLSQ996.jpg   

 

作业控制命令:

     fg [[%]job_num]:把指定的作业调回前台;

     bg [[%]job_num]:把调往后台的指定的作业启动起来,让其后台默默运行;但此作业必须支持运行于后台;

wKiom1YKOYTSH5MdAABkC-7JiiY344.jpg

wKiom1YKOeLQk6q2AABo57xiV8E592.jpg

wKioL1YKOcKhOOgTAADkebZjEoo251.jpg

     kill [%job_num]:终止指定的作业;

wKioL1YKOpeA3xidAAEm5xX1Iy0144.jpg

 

进程优先级调整:

   静态优先级:

    通过指定进程的nice值来调整其优先级;用户 空间运行的进程一般都有其nice值;

    nice值: -20, 19

    优先级:  100, 139

   默认启动进程时,其nice值为0, 其优先级为120;

   

   (1) 对于尚未启动的进程:

        # nice -n N COMMAND

wKiom1YKP-3xQ80FAAJCmuzrkjY107.jpg

wKiom1YKQBuQ_f8lAAFjRrm9do8645.jpg

   (2) 对于已经启动并处于运行中的进程:

        # renice -n N PID 

   注意:普通用户仅能够调大nice,调低优先级;

wKiom1YKQJ2SHrF6AACsveVRDHM161.jpg