Linux进程管理

Linux进程管理

进程基本概述

进程:已启动的可执行程序

/proc目录下数字为名的目录,代表进程,保存着目录的属性信息。每个进程的PID是唯一的(即使进程退出,其他进程也不会占用其PID)

进程的组成

  • 已分配内存的地址空间
  • 安全属性,包括所有权凭据和特权
  • 程序代码的一个或多个执行行线程
  • 进程状态

进程的产生

现有(父)进程复制自己的地址空间来创建一个新的(子)进程结构。每个新进程分配有一个唯一的PID,满足跟踪和安全之需。

进程分类

  • 前台进程:与终端有关能够看到的进程,通过终端启动(也可把在前台启动的进程送往后台,以守护模式运行)
  • 守护进程:daemon,与终端无关,在系统引导过程中启动的进程

linux进程状态

标志内核定义的状态名称和描述
RTASK_RUNNING:进程正在CPU上执行,或者正在等待运行。处于运行中(或可运行)状态时,进程可能正在执行用户例程或内核例程(系统调用),或者已排队并就绪
STASK_INTERRUPTIBLE:进程处于睡眠状态且正在等待某一条件:硬件请求、系统资源访问或信号。当事件或信号满足该条件时,该进程将返回到运行中
DTASK_UNINTERRUPTIBLE:此进程也在睡眠,但与S状态不同,不会响应传递的信号。仅在特定的条件下使用,其中进程中断可能会导致意外的设备状态
KTASK_KILLABLE:进程处于睡眠状态,与不可中断的D状态相同,但有所修改,允许等待中的任务通过响应信号而被中断(彻底退出)。实用程序通常将可中断的进程显示为D状态
TTASK_STOPPED:进程已被停止(暂停),通常是通过用户或其他进程发出的信号。进程可以通过另一信号返回到运行中状态,继续执行(恢复)
TTASK_TRACED:正在被调试的进程也会临时停止,并且共享同一个T状态标志
ZEXIT_ZOMBIE:子进程在退出时向父进程发出信号。除进程身份(PID)之外的所有资源都已释放
XEXIT_DEAD:当父进程清理(获取)剩余的子进程结构时,进程现在已彻底释放。此状态从不会在进程列出实用程序中看到
<高优先级进程
N低优先级进程
+前台进程组中的进程
|多线程进程
s会话进程首进程
  • 进程睡眠的原因

    当一个执行中的进程需要加载额外的IO(输入输出)资源时,由于IO设备的速度太慢,所以进入睡眠状态,交出CPU给其他进程,以免浪费执行时间。

进程优先级(时间分片)

  • 进程优先级范围:0-139,数字越小,优先级越高
    • 0-99:实时优先级,内核调整
    • 100-139:静态优先级,用户可控制
  • 进程优先级高
    • 获得更多CPU运行时间
    • 更优先获得CPU运行机会

相对优先级

由于不是每种进程都与其他进程同样重要,可告知调度程序为不同的进程使用不同的调度策略。常规系统上运行的大多数进程所使用的调度策略称为SCHED_OTHER(也称为SCHED_NORMAL),但还有一些其他策略可用于不同的目的。

由于并非所有进程都以同样的方式创建,可为采用SCHED_NORMAL策略运行的进程指定相对优先级。此优先级称为进程的nice值。一个进程可以有40种不同级别的nice值。

这些nice级别的范围是从-20到19。默认情况下,进程将继承其父进程的nice级别,通常为0

nice级别越高,表示优先级越低(该进程容易将其CPU使用量让给其他进程)

nice级别越低,表示优先级越高(该进程更加不倾向于让出CPU)
如果不存在资源争用(例如当活动进程数少于可用CPU核心数时),即使nice级别高的进程也将仍使用它们可使用的所有可用CPU资源。但当请求CPU时间的进程数超过可用核心数时,nice级别较高的进程将比nice级别较低的进程收到更少的CPU时间

nice级别与权限

为很占CPU资源的进程设置较低的nice级别可能会对同一系统上运行的其他进程的性能造成负面影响,所以仅允许root用户设置负nice级别以及降低现有进程的nice级别。

普通非特权用户仅允许设置正的nice级别。只能对现有进程提升nice级别,而不能降低nice级别。

进程优先级调整

renice NI PID 调整已启动进程的nice值
示例:

另一台设备正执行vi命令
[root@localhost ~]# ps -elf | grep vi
4 S root        745      1  0  80   0 - 24903 poll_s 18:14 ?        00:00:00 /usr/bin/VGAuthService -s
4 S root       1528   1467  0  80   0 - 31561 poll_s 18:36 pts/1    00:00:00 vi abc
0 S root       1531   1442  0  80   0 - 28169 pipe_w 18:36 pts/0    00:00:00 grep --color=auto vi
[root@localhost ~]# renice -1 1528
1528 (进程 ID) 旧优先级为 0,新优先级为 -1
[root@localhost ~]# ps -elf | grep vi
4 S root        745      1  0  80   0 - 24903 poll_s 18:14 ?        00:00:00 /usr/bin/VGAuthService -s
4 S root       1528   1467  0  79  -1 - 31561 poll_s 18:36 pts/1    00:00:00 vi abc
0 S root       1536   1442  0  80   0 - 28169 pipe_w 18:39 pts/0    00:00:00 grep --color=auto vi

nice -n NI COMMAND 在启动时指定nice值

示例:

[root@localhost 123]# nice -n -1 vi abc

[1]+  已停止               nice -n -1 vi abc

(kill -9 PID/$(pidof COMMAND)强行终止进程)

进程管理命令

Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中

ps 列出当前进程

  • a 显示所有与终端有关的进程
  • u 显示进程是由哪个用户启动的
  • x 显示所有与终端无关的进程

    示例:
[root@localhost 123]# ps aux
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.3 129120  6460 ?        Ss   18:14   0:00 /usr/lib/systemd/systemd
root          2  0.0  0.0      0     0 ?        S    18:14   0:00 [kthreadd]
root          3  0.0  0.0      0     0 ?        S    18:14   0:00 [ksoftirqd/0]
root          5  0.0  0.0      0     0 ?        S<   18:14   0:00 [kworker/0:0H]
root          7  0.0  0.0      0     0 ?        S    18:14   0:00 [migration/0]
  • -e 显示所有进程,与-A效果相同
  • -l 以长格式显示
  • -F 显示更详细的完整格式的进程信息
  • -f 显示更详细的完整格式的进程信息

    示例:
[root@localhost 123]# ps -elf
F S UID         PID   PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S root          1      0  0  80   0 - 32280 ep_pol 18:14 ?        00:00:00 /usr/lib/syst
1 S root          2      0  0  80   0 -     0 kthrea 18:14 ?        00:00:00 [kthreadd]
1 S root          3      2  0  80   0 -     0 smpboo 18:14 ?        00:00:00 [ksoftirqd/0]
1 S root          5      2  0  60 -20 -     0 worker 18:14 ?        00:00:00 [kworker/0:0H
1 S root          7      2  0 -40   - -     0 smpboo 18:14 ?        00:00:00 [migration/0]
1 S root          8      2  0  80   0 -     0 rcu_gp 18:14 ?        00:00:00 [rcu_bh]
1 R root          9      2  0  80   0 -     0 -      18:14 ?        00:00:00 [rcu_sched]
  • -H 以进程层级格式显示进程相关信息

    示例:
[root@localhost 123]# ps -elH
F S   UID    PID   PPID  C PRI  NI ADDR SZ WCHAN  TTY          TIME CMD
1 S     0      2      0  0  80   0 -     0 kthrea ?        00:00:00 kthreadd
1 S     0      3      2  0  80   0 -     0 smpboo ?        00:00:00   ksoftirqd/0
1 S     0      5      2  0  60 -20 -     0 worker ?        00:00:00   kworker/0:0H
1 S     0      7      2  0 -40   - -     0 smpboo ?        00:00:00   migration/0
1 S     0      8      2  0  80   0 -     0 rcu_gp ?        00:00:00   rcu_bh
1 R     0      9      2  0  80   0 -     0 -      ?        00:00:00   rcu_sched
5 S     0     10      2  0 -40   - -     0 smpboo ?        00:00:00   watchdog/0
5 S     0     12      2  0  80   0 -     0 devtmp ?        00:00:00   kdevtmpfs
1 S     0     13      2  0  60 -20 -     0 rescue ?        00:00:00   netns
1 S     0     14      2  0  80   0 -     0 watchd ?        00:00:00   khungtaskd
1 S     0     15      2  0  60 -20 -     0 rescue ?        00:00:00   writeback

  • -o 根据自己的需要选择要显示的字段

    示例:
[root@localhost 123]# ps -o pid,ni
   PID  NI
  1467   0
  1602   0
  1688   0
  • aux结果:
    • VSZ Virtual memory SiZe,虚拟内存集
    • RSS ReSident Size,常驻内存集
    • STAT 进程状态
    • TIME 运行时的累积时长
  • ps命令结果解析:
    • NI nice值
    • PRI 优先级
    • PSR 进程运行在哪个CPU核心上
    • RTPTRIO 实时优先级
    • C 运行的CPU编号
    • STIME 进程的启动时间
    • VSZ Virtual memory SiZe,虚拟内存集
    • RSS ReSident Size,常驻内存集
    • STAT 进程状态
    • TIME 运行时的累积时长

pstrss 显示当前系统上的进程树

示例:

[root@localhost 123]# pstree
systemd─┬─NetworkManager─┬─dhclient
        │                └─2*[{NetworkManager}]
        ├─VGAuthService
        ├─auditd───{auditd}
        ├─chronyd
        ├─crond
        ├─dbus-daemon───{dbus-daemon}
        ├─firewalld───{firewalld}
        ├─login───bash
        ├─lvmetad
        ├─master─┬─pickup
        │        └─qmgr
        ├─polkitd───5*[{polkitd}]
        ├─rhnsd
        ├─rhsmcertd
        ├─rsyslogd───2*[{rsyslogd}]
        ├─sshd─┬─sshd───bash───vi
        │      └─sshd───bash─┬─pstree
        │                    └─vi
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        ├─tuned───4*[{tuned}]
        └─vmtoolsd───{vmtoolsd}

pgrep 只显示进程号

示例:

[root@localhost 123]# pgrep vi
745
1602
1619

pidof 根据进程名查找其PID

示例:

[root@localhost 123]# pidof vi
1619 1602

vmstat 虚拟内存状态查看命令

  • 语法:vmstat a n 每a秒刷新n次

    示例:
[root@localhost 123]# vmstat 2 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0      0 1479388   3008 226484    0    0    28     2   56   57  0  0 100  0  0
 0  0      0 1479372   3008 226516    0    0     0     0   46   40  0  0 100  0  0
 0  0      0 1479372   3008 226516    0    0     0     0   39   34  0  0 100  0  0
  • -s 显示内存的统计数据

    示例:
[root@localhost 123]# vmstat -s
      1867024 K total memory
       158112 K used memory
       128328 K active memory
       124720 K inactive memory
      1479388 K free memory
         3008 K buffer memory
       226516 K swap cache
      2097148 K total swap
            0 K used swap
      2097148 K free swap
          405 non-nice user cpu ticks
            0 nice user cpu ticks
         1262 system cpu ticks
       682511 idle cpu ticks
            5 IO-wait cpu ticks
            0 IRQ cpu ticks
           44 softirq cpu ticks
            0 stolen cpu ticks
       182485 pages paged in
        11068 pages paged out
            0 pages swapped in
            0 pages swapped out
       376612 interrupts
       386632 CPU context switches
   1569233664 boot time
         1941 forks
  • procs:
    • r(running) 表示等待运行的队列长度,也即等待运行的进程的个数
    • b(block) 表示阻塞队列长度,也即处于不可中断睡眠态的进程个数
  • memory:
    • swpd 交换内存的使用总量
    • free 空闲物理内存总量
    • buffer 用于buffer的内存总量
    • cache 用于cache的内存总量
  • swap:
    • si(swap in) 表示从物理内存有多少页面换进swap,也即数据进入swap的数据速率(kb/s)
    • so(swap out) 表示从swap有多少页面换进物理内存,也即数据离开swap的数据速率(kb/s)
  • io:
    • bi(block in) 表示磁盘块有多少个被调入内存中,也即从块设备读入数据到系统的速率(kb/s)
    • bo(block out) 表示有多少个磁盘块从内存中被同步到硬盘上去了,也即保存数据至块设备的速率(kb/s)
  • system:
    • in( interrupts) 表示中断的个数,也即中断速率(kb/s)
    • cs(context switch) 表示上下文切换的次数,也即进程切换速率(kb/s)
  • CPU:
    • us 表示用户空间
    • sy 表示内核空间
    • id 表示空闲百分比
    • wa 表示等待IO完成所占据的时间百分比
    • st 表示steal,被虚拟化技术偷走的时间(比如运行虚拟机)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值