CentOS之进程管理

一、什么是进程

一般来讲,进程定义为正在运行的程序的实例,简单地说,进程就是一个正在运行的程序。

  • ==程序== (program):通常为二进制,放置在储存媒体中 (如硬盘、光盘、软盘、磁带等), 为实体文件的型态存在;
  • ==进程== (process):程序被触发后,运行者的权限与属性、程序的程序码与所需数据等都会被加载内存中, 操作系统并给予这个内存内的单元一个识别码 (PID),可以说,进程就是一个正在运行中的程序。

进程不仅仅包含了正在运行的代码,还包括了运行代码所需要的各种资源。内核中使用进程控制块PCB(process control block)管理一个进程的数据结构,每个进程都有一个PCB。

进程是资源所有资源分配的基本单位,线程则是CPU调度的基本单位。

二、多进程调度原理

在一个cpu上,可以存在多个进程,但是同一个时间段内,只能有一个进程工作。操作系统使用一定的算法管理所有进程,使得看起开像是并发执行,称之为“伪并发”;多核CPU可以实现真正意义上的并发。

三、进程的生命周期

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

  • 任何进程都可以创建子进程
  • 所有的进程都是第一个系统进程的后代
    • CentOS 5/6 系统进程 init
    • CentOS 7 系统进程 systemd

进程管理

静态查看进程

ps [options]
支持的命令格式
    unix格式:    -h -e
    BSD格式:    a,x,u
    GNU长格式:    --help
    
    
a //显示现行终端下的所有程序
x //包括不连接终端的终端
u //显示进程详细信息
f //显示进程树
k //指定排序方式,默认是递增,则需要在选择排序的字段上加上减 ps aux k%cpu
o //指定显示的属性 ps opid,cmd,%cpu ...... 不能跟u同时使用
l //详细显示PID的信息
e //相当于 ax
f //显示详细信息,相当于u
F //显示更详细信息
H //显示树状结构
p pid //根据pid查信息
U username //获取指定的用户信息

 

[root@CatdeXin-PC ~]# ps aux | head -3
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.3 194060  6836 ?        Ss   09:37   0:05 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2  0.0  0.0      0     0 ?        S    09:37   0:00 [kthreadd]

- USER  运行进程的用户
- PID   进程ID
- %CPU  CPU占用率
- %MEM  内存占用率
- VSZ   占用虚拟内存 (硬盘)
- RSS   占用实际内存
- TTY   程序运行的终端
- STAT  进程状态
- TIME  占用CPU时间 
- COMMAND 文件路径(文件名字)

进程的状态
+ T Stopped     停止
+ R Running     运行
+ S Sleeping    睡眠
+ Z Zombie      僵尸进程

对进程进行排序

语法
- ps 指令 --sort 排序字段
- 排序字段有 - 为倒叙


#CPU正序排列前五条
[root@CatdeXin-PC ~]# ps aux --sort -%cpu | head -5
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
catdexin   3030  0.1  0.7 640920 14608 ?        Sl   04:41   1:02 /usr/bin/vmtoolsd -n vmusr
root      16567  0.1  0.3 161012  5780 ?        Ss   20:48   0:00 sshd: root@pts/1
root      16666  0.1  0.2 227552  4028 ?        Ssl  20:51   0:00 /usr/libexec/nm-dispatcher
root          1  0.0  0.2 194024  5308 ?        Ss   04:15   0:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 22

进程的父子关系

语法
- ps -ef

示例
[root@CatdeXin-PC ~]# ps -ef |head -5
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 04:15 ?        00:00:04 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root          2      0  0 04:15 ?        00:00:00 [kthreadd]
root          4      2  0 04:15 ?        00:00:00 [kworker/0:0H]
root          6      2  0 04:15 ?        00:00:00 [ksoftirqd/0]

- UID       
- PPID      父进程ID
- STIME     运行时间

自定义字段显示

# 语法
- ps axo 字段名称

# 示例
[root@CatdeXin-PC ~]# ps -axo user,pid,ppid,%mem | head -3
USER        PID   PPID %MEM
root          1      0  0.2
root          2      0  0.0

 


动态查看进程

  • 静态查看进程缺点 不实时
  • 使用top动态查看
top - 21:26:40 up 17:10,  3 users,  load average: 0.00, 0.01, 0.05
Tasks: 238 total,   1 running, 236 sleeping,   1 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  1863040 total,   116688 free,   864068 used,   882284 buff/cache
KiB Swap:  2097148 total,  2087668 free,     9480 used.   821784 avail Mem

   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
    12 root      rt   0       0      0      0 S   0.3  0.0   0:00.42 watchdog/1
 17091 root      20   0  162236   2384   1584 R   0.3  0.1   0:00.02 top
     1 root      20   0  194024   5308   3184 S   0.0  0.3   0:04.69 systemd
     2 root      20   0       0      0      0 S   0.0  0.0   0:00.06 kthreadd
     4 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/0:0H
按Q退出

top信息框有两部分组成
- head 头部 性能信息
- 下半部分 进程查看部分

# 头部信息说明

- 第一行
top - 21:26:40 up 17:10,  3 users,  load average: 0.00, 0.01, 0.05
程序名-系统时间 运行时间 登录用户数 CPU负载 1分钟内占用率 5分钟 15分钟 

- 第二行
Tasks: 238 total,   1 running, 236 sleeping,   1 stopped,   0 zombie
总进程数             运行数 1     睡眠数 236      停止数 0     僵死数 0

- 第三行
%Cpu(s):  0.0 us,  0.2 sy,  0.0 ni, 99.8 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
CPU占用比 us:用户   sy:系统  ni:优先级 id:空闲  wa:等待  hi:硬件   si:软件  st:虚拟机

- 第四行
KiB Mem :  1863040 total,   116688 free,   864068 used,   882284 buff/cache
物理内存K    total 总大小     free 空闲       userd使用     cache 缓存硬盘内容

- 第五行
KiB Swap:  2097148 total,  2087668 free,     9480 used.   821784 avail Mem
虚拟内存K


# 下半部分说明
- PID     进程ID
- USER    启动用户
- PR      系统优先级
- NI      用户优先级
- VIRT    申请内存
- RES     实际占有内存
- SHR     共用内存(几个程序共用一块)
- S       状态
- %CPU    CPU占比
- %MEM    内存
- TIME+   占时
- COMMAND 程序路径和名称
  • top的基本用法
    • h | ? 帮助
    • k 杀死进程
    • shift+M - 按内存的使用排序
    • shift+P - 按CPU使用排序
    • shift+N - 以PIC的大小排序
    • shift+< - 向前
    • shift+> - 向后
    • Z 设置菜色 使用数字调整

top技巧

  • top占用资源比较大 不建议使用
    [root@CatdeXin-PC ~]#top   //回车 立即刷新
    [root@CatdeXin-PC ~]#top -d 1  //每一秒刷新一次
    [root@CatdeXin-PC ~]#top -d 1 -p 10126 //查看指定进程的动态信息
    [root@CatdeXin-PC ~]#top -d 1 -p 10126,4154,545 //同事查看三个进程的状态

     


进程控制Kill

向进程发送信号,实现对进程的管理,每个信号,对应不同的值,对应不同的含义

kill -l 列出所有支持的信号

  • 信号种类
    • 1) SIGHUP 重新加载配置
    • 2) SIGINT 键盘终端 Ctrl+C
    • 3) SIGQUIT 键盘退出 Ctrl+,类似SIGINT
    • 9) SIGKILL 强制终止,无条件
    • 15) SIGTERM 终止(正常结束),缺省信号
    • 18) SIGCONT 继续
    • 19) SIGSTOP 暂停
    • 20) SIGTSTP 键盘暂停 Ctrl+Z
      • 2 3 20 信号 由键盘操作
      • 9 直接杀死 (建议杀僵尸进程)
      • 15 正常流程退出 建议平常使用

kill -信号序号 进程ID
killall -信号序号 进程名称#没有装图形化界面,可能没有这个命令,可以使用pkill
pkill -信号序号 进程名称

练习:
1. 通过两个终端 分别打来两个vim
2. 通过第三个终端,查询两个进程
3. 发送信号9和信号15,观察两个终端程序的状态

 

进程的优先级 nice

首先用top或者ps -l查看进程会发现有PR(PRI) NI两个字段:

  • NI 是优先值,是用户层面的概念, PR是进程的实际优先级, 是给内核(kernel)看(用)的。
  • 一般情况下,PR=NI+20, 如果一个进程的优先级PR是20, 那么它的NI(nice)值就是20-20=0。

    进程调度优先级是从-20到19,一共40个级别,数字越大,表示进程的优先级越低。默认时候,进程的优先级是0。查看进程优先级有两个办法:ps和top。top命令显示的NI列的值。或者可以使用ps -efl来查看,也是在ni列表示了进程的优先级。
进程的优先级可以在程序运行的时候设置,也可以在程序运行过程中动态的修改。

[root@CatdeXin-PC ~]# ps axo pid,command,nice --sort=-nice | head -5
   PID COMMAND                      NI
    48 [khugepaged]                 19
   769 /usr/sbin/alsactl -s -n 19   19
  3089 /usr/libexec/tracker-extrac  19
  3093 /usr/libexec/tracker-miner-   -

    调整优先级

  • 启动具有不同nice级别的进程
    # nice -n 优先级 命令
    
    示例
    [root@CatdeXin-PC ~]# nice -n 5 sleep 70000 &
    [3] 22331
    [root@CatdeXin-PC ~]# ps axo pid,command,nice | grep sleep
     22309 sleep 60000                   0
     22318 sleep 80000                   0
     22330 sleep 60                      0
     22331 sleep 70000                   5
     22333 grep --color=auto sleep       0
  • 更改先有进程的nice级别
    # renice 优先级 PID
    
    示例
    [root@CatdeXin-PC ~]# renice -16 22318
    22318 (进程 ID) 旧优先级为 0,新优先级为 -16
    [root@CatdeXin-PC ~]# ps axo pid,command,nice | grep sleep
     22309 sleep 60000                   0
     22318 sleep 80000                 -16
     22331 sleep 70000                   5
     22375 sleep 60                      0
     22378 grep --color=auto sleep       0

来查看一下系统实际优先级

[root@CatdeXin-PC ~]# top -p 22309,22318,22331
   PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
 22309 root      20   0  108052    356    280 S   0.0  0.0   0:00.00 sleep
 22318 root       4 -16  108052    356    280 S   0.0  0.0   0:00.00 sleep
 22331 root      25   5  108052    356    280 S   0.0  0.0   0:00.00 sleep

后台程序操作

// 查看后台进程
# 命令: jobs 
[root@CatdeXin-PC ~]# jobs
[2]   运行中               sleep 35000 &
[3]-  运行中               sleep 6000 &
[4]+  运行中               sleep 8000 &

- 次一级
+ 最新的

// 将后台进程调到前台执行
# 命令: fg 后台序号  
[root@CatdeXin-PC ~]# fg 3
sleep 6000
^Z //Ctrl+Z(键盘停止)将前台程序放到后台 但是是停止状态
[3]+  已停止               sleep 6000
[root@CatdeXin-PC ~]# jobs
[2]   运行中               sleep 35000 &
[3]+  已停止               sleep 6000 // 停止了
[4]-  运行中               sleep 8000 &

// 通过指令让后台暂停的进程继续运行
# 命令: bg 后台序号
[root@CatdeXin-PC ~]# bg 3
[3]+ sleep 6000 &
[root@CatdeXin-PC ~]# jobs
[2]   运行中               sleep 35000 &
[3]-  运行中               sleep 6000 &
[4]+  运行中               sleep 8000 &
[root@CatdeXin-PC ~]#

// 因为后台序号不是PID 所以kill杀死的时候 带上百分号
# 命令: kill 信号 %指令
[root@CatdeXin-PC ~]# kill %2
[root@CatdeXin-PC ~]# kill -15 %3
[root@CatdeXin-PC ~]# jobs
[2]   已终止               sleep 35000 &
[3]-  已终止               sleep 6000
[4]+  运行中               sleep 8000 &

 

注意
“++kill 1” 和 “kill %1” 不同
前者是杀死PID为1的进程
后者杀死作业序号1的后台程序

扩展内容 提前了解

查看内存信息

指令: free
- free 默认是以字节单位显示的 可以加上参数 使观察更便捷
    -b # 字节
    -k # kb
    -m # mb
    -g # gb
    -h # 人类易读的方式
    -c # 刷新次数
    

[root@CatdeXin-PC ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:           1.8G        1.2G         77M         26M        512M        408M
Swap:          2.0G         80M        1.9G

查看硬盘信息

指令: df

[root@CatdeXin-PC ~]# df -hT
文件系统                类型      容量  已用  可用 已用% 挂载点
devtmpfs                devtmpfs  894M     0  894M    0% /dev
tmpfs                   tmpfs     910M     0  910M    0% /dev/shm
tmpfs                   tmpfs     910M   11M  900M    2% /run
tmpfs                   tmpfs     910M     0  910M    0% /sys/fs/cgroup
/dev/mapper/centos-root xfs        50G  4.9G   46G   10% /
/dev/mapper/centos-home xfs        27G  133M   27G    1% /home
/dev/sda1               xfs      1014M  185M  830M   19% /boot
tmpfs                   tmpfs     182M   48K  182M    1% /run/user/1000
/dev/sr0                iso9660   4.5G  4.5G     0  100% /run/media/catdexin/CentOS 7 x86_64
tmpfs                   tmpfs     182M     0  182M    0% /run/user/0

虚拟内存统计Vmstat

vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控。是对系统的整体情况进行统计,不足之处是无法对某个进程进行深入分析。

vmstat [options] [delay [count]]
[root@s22 ~]#vmstat 1 3 每秒刷新一次,刷新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 282028  74012      0 320876    2   11   257    64  104  105  1  1 98  0  0
 0  0 282028  73988      0 320876    0    0     0     0   81   86  0  1 99  0  0
 0  0 282028  73988      0 320876    0    0     0     0   68   62  0  0 100  0  0
procs

procs
    r        运行队列中进程数量
    b         等待IO的进程数量
memory:
    swap     使用虚拟内存大小
    free     可用内存大小
    buff     用作缓冲的内存大小
    cache     用作缓存的内存大小
swap:
    si        从磁盘交换到内存的数据速率(kb/s)
    so        从内存交换到次哦按的数据速率(kb/s)
io:
    bi        从磁盘读取到系统的速率(kb/s)
    bo        从系统写入到磁盘的速率(kb/s)
system:
    in        中断频率
    cs        进程之间切换的频率
cpu:
    us       用户进程执行时间(user time)
    sy       系统进程执行时间(system time)
    id       空闲时间(包括IO等待时间),中央处理器的空闲时间 。以百分比表示。
    wa       等待IO时间
    st

如果r经常大于4,id经常少于40,表示cpu的负荷很重。

如果bi,bo长期不等于0,表示内存不足。

如果disk经常不等于0,且在b中的队列大于3,表示io性能不好。

Linux在具有高稳定性、可靠性的同时,具有很好的可伸缩性和扩展性,能够针对不同的应用和硬件环境调整,优化出满足当前应用需要的最佳性能。因此企业在维护Linux系统、进行系统调优时,了解系统性能分析工具是至关重要的。

显示活跃和非活跃内存

vmstat -a 2 5 【-a 显示活跃和非活跃内存,所显示的内容除增加inact和active】

[root@CatdeXin-PC ~]# vmstat -a 2 5
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st
 1  0  81408 106412 703472 693716    0    1    31     3   22   34  0  0 100  0  0
 1  0  81408 106420 703472 693868    0    0     0     4   83  131  0  0 100  0  0
 0  0  81408 106420 703472 693868    0    0     0     0   74  114  0  0 100  0  0
 0  0  81408 106420 703472 693868    0    0     0     0   68  108  0  0 100  0  0
 0  0  81408 106420 703472 693868    0    0     0    37  125  169  1  0 99  0  0
显示从系统启动至今的fork数量

vmstat -f 【 linux下创建进程的系统调用是fork】

[root@CatdeXin-PC ~]# vmstat -f
        13255 forks

说明: 信息是从/proc/stat中的processes字段里取得的

查看内存使用的详细信息

vmstat -s 【显示内存相关统计信息及多种系统活动数量】

[root@CatdeXin-PC ~]# vmstat -s
      1863032 K total memory
      1274088 K used memory
       693632 K active memory

说明:这些信息的分别来自于/proc/meminfo,/proc/stat和/proc/vmstat

查看磁盘的读/写

vmstat -d 【查看磁盘的读写】

[root@CatdeXin-PC ~]# vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
       total merged sectors      ms  total merged sectors      ms    cur    sec
sr0       29      0    2100      39      0      0       0       0      0      0
sda    58166    813 7953445  105404  10328  22007  776259   14866      0     29
dm-0   55932      0 7880178  105017  11865      0  608442   17945      0     28
dm-1    1107      0   12560    1152  20441      0  163528   64605      0      1

说明:这些信息主要来自于/proc/diskstats.

查看/dev/sda1磁盘的读/写

vmstat -p /dev/sda1 【显示指定磁盘分区统计信息】

[root@CatdeXin-PC ~]# vmstat -p /dev/sda1
sda1          reads   read sectors  writes    requested writes
                2012      53363         28       4289

说明:这些信息主要来自于/proc/diskstats.
    - reads:  来自于这个分区的读的次数。
    - read sectors:  来自于这个分区的读扇区的次数。
    - writes:  来自于这个分区的写的次数。
    - requested writes:  来自于这个分区的写请求次数。

查看系统的slab信息

vmstat -m

说明:这些信息主要来自于/proc/slabinfo
    slab:  由于内核会有许多小对象,这些对象构造销毁十分频繁,比如i-node,dentry,这些对象如果每次构建的时候就向内存要一个页(4kb),这样就会非常浪费,为了解决这个问题,就引入了一种新的机制来处理在同一个页框中如何分配小存储区,而slab可以对小对象进行分配,这样就不用为每一个对象分配页框,从而节省了空间,内核对一些小对象创建析构很频繁,slab对这些小对象进行缓冲,可以重复利用,减少内存分配次数

proc(了解)

虚拟文件系统: 采集服务器自身 内核,进程运行的状态信息

  • CPU: /proc/cpuinfo
    // 记录CPU一些信息
    [root@CatdeXin-PC ~]# cat /proc/cpuinfo
  • 内存: /proc/meminfo
    [root@CatdeXin-PC ~]# cat /proc/meminfo
  • 内核: /proc/cmdline
    [root@CatdeXin-PC ~]# cat /proc/cmdline
    BOOT_IMAGE=/vmlinuz-3.10.0-1127.el7.x86_64 root=/dev/mapper/centos-root ro crashkernel=auto spectre_v2=retpoline rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet LANG=zh_CN.UTF-8
    
    [root@CatdeXin-PC ~]# ls /boot
    ···略···
    vmlinuz-3.10.0-1127.el7.x86_64

     

posted @ 2021-01-18 17:40  CatdeXin  阅读(478)  评论(0)    收藏  举报