美文网首页
Linux进程管理、作业及相关工具

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

作者: 魏镇坪 | 来源:发表于2016-03-07 14:11 被阅读391次

    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进程管理、作业及相关工具

          本文链接:https://www.haomeiwen.com/subject/apnakttx.html