Linux进程管理、作业及相关工具

Linux进程管理原理

Linux的进程管理,就是对硬件各资源进行分配、调度、销毁等工作,其主要部件的管理为:CPU、内存、IO的分配和调度工作。其CPU的指令执行又分为特权指令、普通指令级别,而在linux系统层面将其对应为内核空间、用户空间。系统运行之上的程序通常只能执行普通指令,如果需要管理硬件,与硬件相关的读、写、删除操作(即面向硬件层面的请求),需要向init进程提交请求,再由Init进程发送给内核,由内核调用CPU完成其指令,这个过程被称作为系统调用,也被称为软中断。而系统调用在用户空间的表现形式为各种函数,即程序内部代码调用了其对应的函数模块。从用户模式切换到内核模式,或者从内核模式到用户模式,这个过程就称之为模式切换。当发起一个系统调用,通常被称之为一个软中断. 当IO或者其他的硬件完成操作,需要将其结果发送给CPU处理时,CPU此时将暂停其他工作,接手其IO的中断请求,这过程被称之为硬中断.
CPU是将其计算能力划分为以时间为单位的时间片,再将时间片发配给进程使用,以此来完成程序的响应。由于各进程会抢用时间片,以造成其他进程不能正常工作的情况,此时将由内核管理进程的运行状态、优先级、进程的生命周期等工作,此过程被称之为进程调度。当计算机只有一颗物理CPU时,意味着正在运行的情况只能有一个,多任务处理的情况会面临抢占资源。故需要将多个等待处理的进程状态保存至内存中,Linux内核存储进程的结构体被称之为task struct,每个task struct都保存了其进程名,存储位置,进程的优先级等信息,多任务的task struct存储被称之为链表结构(task list),即内核把物理内存分成大小为4k的页框,再将页框分配给进程的虚拟内存(vritual size,虚拟内存集),让每个进程都工作在虚拟内存集中,从虚拟层面感知自己可用空间为系统的剩余空间。当系统启用时会加载很多的基本库glic或者其他的程序所共同依赖的库文件,都会一次性加载到内存中,这部分被称之为共享内存集(shared size),如果每个内存将使用共享内存中的库文件,会在自己的虚拟内存中添加其所需的文件内存地址指针.而不是把所需要的文件都加载到其进程空间中。
共享内存集又被分为常驻内存和不常驻内存,常驻内存一般是系统调用所需要的库文件,故是不能被交换到交换分区的。当内存负荷比较大的情况下,内核会通过LRU算法将不常用的内存空间交换到交换分区,如果需要重新使用此进程时,内核又会将其调入到内存中加载被使用。
内存管理中,每个进程又被分优先级。内核将进程划分为280个队列,其中140个队列存放过期队列(被调度过的进程),140个队列存放运行的进程,当下次调用进程的时候,只需要扫描140个运行的进程队列首部即可,以此完成快速调用。其每个队列有其对应的优先级,表示范围为『0-139』。「0-99」是实时优先级,数值越大,优先级越大。「100-139」是静态优先级,其中可通过管理命令调整,使用nice值表示为-20,19,并对应100-139的优先级。其nice值越小表示优先级越高。越高优先级的进程会被优先调用执行。当一个进程正在运行时,此时一个高的优先级进程需要先执行,CPU将暂停正在运行的进程,将CPU的运行状态保存至寄存器,这个过程称之为保存现场。这种进程与进程之间的切换,也被称之为上下文切换。
内存存放数据格式
  • 堆(heap)
    • 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收
  • 栈(stack)
    • 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等
  • 代码段
  • 数据段
进程间通信机制IPC (inter process communication):
  • socket
  • D-bus(用于桌面程序和OS通信)
  • Dcop(轻量级的,功能较少,一般用于K桌面环境)
  • SOAP(用于web服务,使用http其传输协议)
  • XML-RPC(用于web服务,使用http其传输协议)
  • CORBA(面积对象编程中复杂的IPC解决方案)
进程的类型
  • 守护进程:daemon(服务类),在系统引导过程中启动的进程,跟终端无关
  • 前台进程:跟终端相关,通过终端启动的进程
进程的状态及其就对的代码
  • 运行态:running,正在运行的
    • R:running
  • 就绪态:ready,等待运行的
  • 睡眠态:
    • 可中断的睡眠:interruptable
      • S : interruptable-sleeping
    • 不可中断的睡眠 :uninterruptable(其有IO等待)
      • D :uninterruptable-sleeping
  • 停止态:stopped,暂停于内存中,但不会被调度执行,除非手动启动
    • T : stopped
  • 僵死态:zombile,僵尸进程
    • Z : 僵死态
进程标识符代码:
  • + : 前台进程,运行在终端之上,需占用prompt
  • l : 多线程进程
  • N : 低优先级
  • < : 高优先级
  • s : session leader, 可以理解为会话的父进程
查看内核中进程的相关信息
  • /proc/PID
  • /proc/PID/maps : 进程存放内存映射的位置
进程IO调用的过程:
  • 先将数据由内核加载到内核空间,
  • 再将内核空间的数据复制一份到进程空间
Centos各版本的守护进程
  • Centos 5
    • Sys init --> 依赖脚本串行启动,比较慢
  • Centos 6
    • Sys init --> upstart启动程序,依赖于ubus机制通信,并行启动各进程
  • Centos 7
    • Systemd --> systemd启动程序,只需要一个init进程,就可以把各服务启动起来,启动速度快

=========

Linux下进程管理各工具

ps命令
工作原理:
  • 通过/proc输出状态信息。/proc/PID的目录下,存放了当前进程的各种信息

ps命令

ps - ps - report a snapshot of the current processes.
  • synopsis: ps [options]
    • [options]
      • 其有三种风格使用方法:
            1 UNIX options, which may be grouped and must be preceded by a dash. 
            2 BSD options, which may be grouped and must not be used with a dash. 
            3 GNU long options, which are preceded by two dashes.

* `a` : 所有与终端相关的进程
* `x` : 所有与终端无关的进程
* `u` : 以用户为中心来组织状态信息显示,其是以PID进行排序
* `-e` : 显示所有进程
* `-f` : 显示完整格式的进程信息
* `-F` : 显示完整格式
* `-H` : 以层级结构显示进程的相关信息
* `o` : 自定义要显示的字段列表,以逗号分隔
    * ps axo pid,cmommand
常用组合:
  • ps aux
      [root@zhenping 1]# ps aux
      USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
      root          1  0.0  0.7  59632  7676 ?        Ss   21:06   0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 24
    
  • ps -ef
      [root@zhenping 1]# ps -ef
      UID         PID   PPID  C STIME TTY          TIME CMD
      root          1      0  0 21:06 ?        00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 24
    
  • ps -eFH
      root@zhenping 1]# ps -eFH
      UID         PID   PPID  C    SZ   RSS PSR STIME TTY          TIME CMD
      root          2      0  0     0     0   0 21:06 ?        00:00:00 [kthreadd]
    
  • ps -eo
      [root@zhenping 1]# ps -eo pid,command,user
      PID COMMAND                     USER
    
  • ps axo
      root@zhenping 1]# ps axo pid,command,user,nice
      PID COMMAND                     USER      NI
    
ps中常用的命令字段
  • pid
  • nice
  • pri:优先级
  • psr:进程当前分配的处理器
  • pcup:占用CPU百分比
  • stat:进程状态
  • command:运行的程序
  • tty:终端
  • ppid:父进程
  • rtprio :realtime priority,实时优先级
ps命令显示中的字段名称含义
  • %CPU : 占用CPU的百分比
  • %MEM : 占用内存的百分比
  • VSZ : virtual size,虚拟内存集(线性内存空间存数据占用的大小)
  • RSS : resident size,常驻内存集,不能放到交换内存上,有的时候也会显示为RSZ(rsszie.resident set size)
  • STAT : 进程的运行状态
  • time : 进程占用CPU的累计时间
  • USER : 用户

pgrep命令

功能
  • 进程过滤,以实现快递查找进程
pgrep - pgrep, pkill - look up or signal processes based on name and other attributes
  • synopsis: pgrep [options] pattern

  • [options]

    • -u UID : 显示指定用户的进程

    • -U UID : read user,由谁启动的进程

    • -t Terminal : 与指定的终端相关的进程

    • -l : 显示进程名

    • -a : 显示完整格式的进程名,进程名和启动的参数

    • -p PIDNUM : 显示此进程的子进程

        pgerp ssh : 查看进程中有ssh的字符串的进程
        pgrep sshd | xargs -i kill -9 {}  #将所有sshd进程退出
        pgrep sshd | xargs kill -9 #同上
      

pkill命令

  • 用法与pgerp相同

pidof命令

  • 取指定进程的进程号

      pidof sshd   # 显示sshd的进程号
      2215 1041
    

top命令

top - display Linux processes
top中显示名称含义解释
  • 第一行(uptime信息,可以使用l命令关闭或显示)

      系统的当前时间、运行时长、登录用户、平均负载(过去1分钟、5分钟、15分钟的平均负载,指每逻辑CPU进程队列长度)
    
  • 第二行(进程任务)

  • 第三行 : (CPU使用情况,可以使用t命令关闭或显示)

    • us : 用户空间
    • sy : 内核空间(一般负载的CPU,us与sy所点的比例为7:3)
    • ni : nice
    • id : 空闲百分比
    • wa : 等待IO完成的时间
    • hi : 硬件中断消耗CPU百分比
    • si : 软件中断消耗CPU百分比
    • st : 被偷走的百分比,一般指虚拟机
    • cs : 上下文切换
  • 第四行(内存使用信息,可以使用m命令关闭或显示)

    • 总空间
    • 空闲空间
    • 已使用空间
    • 缓冲和缓存的空间(可以被回收再使用,不逄真的占用)
      • 真正的系统空间应为:free + buff/cache
  • 常用字段说明
  • VIRT : 虚拟内存集

  • RES : 常驻内存集

  • SHR : 共享内存集

  • 常用命令
  • M : 以内存占用率排序

  • P : 以CPU占用率排序

  • T : 以累计占用CPU时间排序

  • q : 退出top工具

  • k : 终端指定的进程

  • s : 更改top的刷新时间,默认为3秒

  • u : 只显示指定用户的进程

  • top启动参数
  • -d # : 启动时指定刷新时间间隔,默认为3秒

  • -b : 以批次方式显示

  • -n # : 显示多少批次

htop命令
  • [options]

    • -d # : 指定刷新时间的时间间隔
    • -u USERNAME :仅显示指定用户的进程
    • -s COLUME : 以指定字段进程排序
  • 内置命令

    • s : 显示进程的系统调用
    • l : 显示选定的进程打开的文件列表
    • t : 以层级关系显示各进程的状态
    • a : 选定进程绑定在指定的CPU上

=========

Linux性能查看工具

vmstat命令
vmstat - Report virtual memory statistics
  • synopsis: vmstat [options] [delay [count]]

      vmstat 2 : 每两秒钟显示一次
      vmstat 2 3 : 每两秒钟显示一次,显示3次
    
  • [options]

    • -s : 显示内存各种统计数据
各种选项字段说明
  • procs

    • r : 处于等待运行的进程个数,即每CPU上等待运行的任务长度,实时的,不是其平均值
    • b : 阻塞的任务队列长度,处于不可中断睡眠态的进程个数,如果这个值太大,说明IO太大
  • memory

    • swpd : 交换内存的使用问题,0表示没有启动交换内存,如果使用量太大,说明服务器内存太小了
    • free : 空闲的物理内存总量
    • buff : 用于buffer的内存总量
    • cache : 用于cache的内存总量
  • swap

    • si : 平均值,数据进入swap中的数据速率(kb/s)
    • so : 平均值,数据离开swap中的数据速率(kb/s)
      • 注意:si so的活动频繁,速率大,交换内存也使用了,并且有增大的趋势,说明物理机的内存太小了
  • io

    • bi : 从块设备读入数据到内存的速率(kb/s)
    • bo : 从内存到块设备的速率(kb/s)
  • system

    • in : interrups(中断),中断速率,数值太大了,说明CPU太弱
    • cs : context switch ,上下文切换速率,数值太大了,说明CPU太弱
  • CPU

    • us:用户空间占用的百分比
    • sy:内核空间
    • id: idle,空闲的
    • wa: wait,等待IO完成的
    • st: stolen,被偷走的时间
dstat命令:
dstat - versatile tool for generating system resource statistics
  • dstat [-afv] [options..] [delay [count]]

    • [options]
      • -c: 查看CPU
      • -C #,#..,total :查看指定CPU或总的CPU
      • -d :disk的相关信息
      • -D sda,sdb….total :磁盘信息
      • -g : 显示Page相关的统计数率数据
      • -i : 中断
      • -m : mem
      • -n ;interface的相关统计数据
      • -p : process的相关统计数据
      • -r : IO请求相关统计数据
      • -s : swapped相关统计数据
      • -t : 输出当前时间
      • —-aio : 异步同步信息
      • —-rpc
      • —-lock : 文件锁的信息
      • —-raw : 祼套接字的信息
      • -—tcp :查看tcp连接信息
      • -—udp:
      • —-raw
      • —-socket
      • —-ipc
      • —-top-io: 显示最占用io的进程
      • —-top-cpu: 最占用cpu的进程
      • —-top-int :最大中断的进程
      • —-top-mem:最占用内存的进程
      • —-top-latency: 延迟最大的进程
iostat
iostat - Report Central Processing Unit (CPU) statistics and input/output statistics for devices and partitions
  • [options]
    • -d : 显示磁盘设备

    • -k : 以block为单位显示的列强制使用K为单位

    • -x : 显示其扩展信息

        iostat -x 1 10 : 显示扩展信息,以1秒刷新间隔,显示10次
        Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
        sda               0.06     0.05    1.07    0.28    12.36     5.81    26.90     0.00    0.91    0.70    1.71   0.74   0.10
        
        说明:
            rsec/s:每秒读取的扇区数;
            wsec/:每秒写入的扇区数。
            avgqu-sz 是平均请求队列的长度。毫无疑问,队列长度越短越好
            await:  每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间,一般地                     系统IO响应时间应该低于5ms,如果大于10ms就比较大了。这个时间包括了队列时间和服务时                       间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之                      差值越大,队列时间越长,说明系统出了问题。
            svctm    表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表                        示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太                       长,系统上运行的应用程序将变慢。
            %util: 在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在                        处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙                        程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即                      使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。
      
pmap命令
功能:
  • 查看进程内存映射表
synopsis: pmap [option] PID [...]
  • [option]
    • -x : 显示详细格式的信息

        pmap -x 1 #显示Pid为1的内存映射表详细信息
        pma 1 #显示PID为1的内存映射表信息
      
注意:可以 cat /proc/1/maps,也可以查看进程的内存使用情况
glances 命令
  • 跨平台的监控工具,其监控计算机的性能信息,可以理解为远程版本的top工具
内建命令
  • b : 以Byte为单位显示网卡数据速率

  • d : 关闭磁盘IO模块

  • m : 关闭mount模块

  • n : 关闭network模块

  • t # : 刷新时间间隔

  • 1 : 每个CPU的统计数据单独显示

  • -o {html | csv} : 以指定格式输出

  • -f /path/DIR : 设定输出文件的位置

      glances -o HTML -f /root/ : 指定以html格式输出到root目录下
    
glances的C/S模式
  • 服务端:

      glances -s -B IPADDR # ipaddr指本机的某地址,用于监听,-s表示为服务端,-B表示指定哪个IP地址
    
  • 客户端:

      glances -c IPADDR # -c表示为一个client,IPADDR为服务端的IP地址
    
kill命令
kill - kill - terminate a process
  • synosis: kill -l
    • 信号标识方法有三种:
      • 信号的数字标识
      • 信号的完整名称
      • 信号的简写名称
  • synopsis: kill [-s signal|-p] [-q sigval] [-a] [--] pid...
常用信号
    1. SIGHUP:无须关闭进程而让其重新读取配置文件
    1. SIGINT: interrupts之义,终止正在运行的进程
  • 9)SIGKILL : 杀死运行中的进程(直接退出)

  • 15)SIGTERM : 终止正在运行的进程(让其保存好数据再退出)

  • 18)SIGCONT : 继续

  • 19)SIGTOP : 停止

      kill -1 2219 # 让此进程重读配置文件
      kill -sigkill 2219 
    
调整进程优先级
  • 可通过nice命令调整进程的优先级,优先级的范围为100-139,分别对应 -20,19的阀值,进程启动时nice值为0,其对应的优先级为120,nice数值越小优先级越高
nice命令
nice - run a program with modified scheduling priority
nice [option] [COMMAND][ARGU….]
  • [options]
    • -n NICE : 指定nice值

        nice -n -5 htop #为115优先级启动htop
        
        注意:nice值只有管理员可调
      
renic命令
renice - alter priority of running processes
renice [-n] NICE PID
  • [options]
    • -n NICE : 指定NICE值

        renice -n -3 5207 : 调整进程PID为5207的nice值为-3 
      

================

Linux上的作业控制

作业的分类
  • 前台作业(foregroud)
    • 通过终端启动,且启动后会一直占据终端
  • 后台作业(backgroud)
    • 可以通过终端启动,但启动后立即转入后台运行
如果将作业运行于后台
  • ctrl + z
    • 此方法会将作业转为停止状态
  • COMMAND &
    • 此类作业立即送到后台,也会有终端相关,如果终端停止了,作业也会被停止
  • nohup COMMAND &
    • 此类作业立即送到后台,脱离终端
显示当前系统上的所有作业
jobs 命令
    root@zhenping ~]# jobs
    [1]-  已停止               vim a.sh
    [2]+  已停止               ping 202.96.209.5
将作业从后台调回到前台
  • fg 命令
    • fg [[%]] JOB_NUM]]
      • %:表示这是一个作业号

      • JOB_NUM : 作业号码

          fg 1 # 把1号作业调回到前台
        
将后台作业从停止状态变成运行状态
  • bg命令
    • bg [[%]] JOB_NUM]]

        [root@zhenping ~]# bg 3  #3号作业从停止转运行状态
        [3]+ ping 202.69.209.5 &
      
结束作业
  • kill命令
    • kill %job_NUM

        [root@zhenping ~]# kill %2 #结束2号作业
      

你可能感兴趣的:(Linux进程管理、作业及相关工具)