进程是程序运行的一个副本,存在生命周期,cpu按照时间分配每个进程运行,还未结束的进程将保存在内存存储的固定格式中(task struct),多个任务的task struct组成的链表称task list。我们用指令查看的结果其实就是保存在task list中的数据,进程间的数据通过cow写时复制实现数据独立。

  • 进程优先级
    • 实时优先级:0-99,数字越大,优先级越高;实时优不可调,优先级最高。
    • 静态优先级: 100-139,数字越小,优先级越高;非内核程序一般都属于这类,默认120,可以用nice值来调整,nice值范围在 -20-19,为了方便显示,priority默认显示 20,范围在0-39之间,实际是100-139。

进程内存分配,一个4G内存机器,内核会把物理内存用Page Frame形式分配给每个进程,最大3G,所以,每个进程都一位自己是除了内核唯一的进程,进程中的数据分为两大类。

  1. VSZ:虚拟内存集合,包含大量的库引用
  2. RSS:常驻内存,一些重要的指令集

进程状态 :

  1. 运行态:running
  2. 就绪态:ready
  3. 睡眠态:
    1. 可中断:interruptable 无须额外数据准备
    2. 不可中断:uninterruptable 比如io过程中 还未加载完成
  4. 停止态:暂停于内存中,但不会被调度,除非手动启动之;stopped
  5. 僵死态:zombie

ps

ps有3种显示风格
UNIX风格,选项带一个 -
BSD风格 选项不带 -
GNU 带两个-的长选项

BSD风格:

常用选项

a:所有与终端相关的进程;
x:所有与终端无关的进程;
u:以用户为中心组织进程状态信息显示;

[root@node1 ~]# ps axu
USER        PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root          1  0.0  0.3 193700  6848 ?        Ss   12:28   0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 21

USER
PID
%CPU    cputime/realtime  cpu使用时间 除 进程累计运行时间
%MEM    占整个内存比率
VSZ     虚拟内存集      虚拟内存集中可能包含很多共享库   单位是kb
RSS    常驻内存集  (resident set size, the non-swapped physical memory that a task has used (in kiloBytes).(alias rssize, rsz).)单位是kb

STAT    
       R:running
        S:interruptable sleeping
        D:uninterruptable sleeping
        T:Stopped
        Z:zombie
        +:前台进程
        l:多线程进程
        N:低优先级进程
        <:高优先级进程
        s:session leader 
TIME   累计cpu使用时间

UNIX风格

常用选项

-e:显示所有进程
-f:显示完整格式的进程信息
-F:显示完整格式的进程信息;
C: cpu utilization cputime/realtime cpu使用时间 除 进程累计运行时间
PSR:运行于哪颗CPU之上
-H:以层级结构显示进程的相关信息;

[root@node1 ~]# ps -ef
UID         PID   PPID  C STIME TTY          TIME CMD
root          1      0  0 12:28 ?        00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 21
root          2      0  0 12:28 ?        00:00:00 [kthreadd]

UID
PID
PPID   父pid
C      cputime/realtime  cpu使用时间 除 进程累计运行时间
STIME  启动时间
TTY 相关终端
TIME   cpu累计时间
CMD

自定义选项,o field1, field2,...,个人觉得非常好用
常用自定义字段

uid
uname
group
fuid filesystem access user ID
fuser
gid
%cpu pcpu
%mem pmem
psr processor that process is currently assigned to 运行于哪颗CPU之上
pid
ppid
tty
rtprio realtime priority 实时优先级 越大优先级越高
priority 用户优先级 (pri不一样算法)
ni nice nice value. This ranges from 19 (nicest) to -20 (not nice to others)
vsz vsize 虚拟内存
rss rssize rsz 常驻内存
s stat 状态
start 命令开始时间
args cmd command

[root@node1 ~]# ps axo uname,pid,ppid,tty,pcpu,pmem,rtprio,priority,ni,vsz,rsz,s,start,cmd,pri
USER        PID   PPID TT       %CPU %MEM RTPRIO PRI  NI    VSZ   RSZ S  STARTED CMD                         PRI
root          1      0 ?         0.0  0.3      -  20   0 193700  6848 S 12:57:49 /usr/lib/systemd/systemd --  19

top

top - display Linux processes

top - 01:51:36 up 13:22,  3 users,  load average: 0.00,0.01,0.05
      当前时间      运行时常  3个用户    平均负载     过去1分钟、5分钟和15分钟的平均负载;cpu*(0-0.7表示顺畅  1满负载 5将近死机)
Tasks: 112 total,   2 running, 110 sleeping,   0 stopped,   0 zombie
    总共多少进程       2个在跑     110在睡眠       0个停止      0个僵死
%Cpu(s):  0.0 us,    0.1 sy,    0.0 ni,                      99.9 id,  0.0 wa,     0.0 hi,             0.0 si,     0.0 st
  用户空间占用百分比    内核占用     用户进程改变过优先级的进程占用    空闲idle   等待(io)   硬件中断hardware     interrupt   软件中断     被偷走steal
KiB Mem :  1867048 total,  1383244 free,   166956 used,   316848 buff/cache
  内存          总空间           空闲空间         使用                可回收buffer待写入 cache读取缓存
KiB Swap:  2097148 total,  2097148 free,        0 used.  1501796 avail Mem
  交换分区

   PID USER      PR优先级    NI    VIRT虚拟内存集    RES常驻内存    SHR共享内存     S  %CPU %MEM     TIME+(cpu累计占用时间)    COMMAND
   607 root      20         0     305100           6168         4800           S   0.3  0.3     0:48.91                 vmtoolsd

交互

M  根据内存排序 
T  cpu累计占用时间  time排序
P:以占据CPU百分比排序;
首部信息:
        uptime信息:l命令
        tasks及cpu信息:t命令
                1 分别显示每个cpu
        内存信息:m命令
修改刷新时间间隔:s
终止指定的进程:k
退出命令:q

htop 使用

说完top,在介绍一款升级版top htop,相比top,htop提供更多的鼠标方便操作,更直观的可视化。

[root@node1 yum.repos.d]# yum install htop

Linux 进程管理

帮助说明

/ search
p 详细/简洁 程序路径
t 树状显示 可查看进程关系
u 根据user筛选
K 显示/隐藏 内核线程 而在top是显示的
H 显示/隐藏 用户线程
F 光标跟踪程序
P 根据cpu排序 M 根据内存排序 T根据cpu占时间排序
I 逆序
自定义字段排序
space 下一个经常
K 结束进程
a 绑定进程在哪个cpu
l 显示进程打开的文件
s 查看当前进程发起的系统调用
i 涉及优先级
] 增加优先级
[ 减少优先级

选项:
-d #:指定延迟时间间隔;
-u UserName:仅显示指定用户的进程;
-s COLUME:以指定字段进行排序;
子命令:
l:显示选定的进程打开的文件列表;
s:跟踪选定的进程的系统调用;
t:以层级关系显示各进程状态;
a:将选定的进程绑定至某指定的CPU核心;


dstat

versatile tool for generating system resource statistics,非常强大系统监测工具
安装

[root@node1 ~]# yum install dstat

常用选项 

-c, --cpu cpu信息
-C 0,3,total 哪块cpu
-d, --disk 磁盘读写
-D total,sda 显示磁盘的相关信息
-g, --page 显示page相关的速率数据;
-i, --int 终端
-l, --load enable load average stats (1 min, 5 mins, 15mins)
-m, --mem Memory的相关统计数据
-n, --net 网络的相关统计数据;
-N eth1,total
-p, --proc 进程状态
-r: --io 显示io请求的相关的统计数据;
-s --swap: 显示swapped的相关统计数据;
-t, --time 当前时间
-y, --sys cpu中断 切换
--aio 异步io
--fs, --filesystem 文件数量和inodes
--ipc 队列信号量共享内存
--raw 全部socket
--socket tcp udp等
--tcp --udp
--output file
--top-cpu 最高cpu使用
--top-cputime
--top-io: 最占用io的进程;
--top-mem: 最占用内存的进程;
--top-latency: 延迟最大的进程;

dstat delay count

[root@node1 ~]# dstat 1 2  
You did not select any stats, using -cdngy by default.
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int中断   csw-上下文切换
  0   0 100   0   0   0|3413B 4582B|   0     0 |   0     0 |  87    64
  0   0 100   0   0   0|   0     0 | 120B  818B|   0     0 |  71    53
  0   0 100   0   0   0|   0     0 |  60B  338B|   0     0 |  48    41

查看cpu

[root@node1 ~]# dstat -c  1 1
----total-cpu-usage----
usr用户占用比率  sys内核  idl空闲  wai等待   hiq硬件中断  siq软件中断
  0   0 100   0   0   0
  0   0 100   0   0   0

查看内存

[root@node1 ~]# dstat -m  1 1
------memory-usage-----
 used  buff  cach  free
 294M 2080k  472M 1055M
 294M 2080k  472M 1055M

磁盘读写

[root@node1 ~]# dstat -d  1 1
-dsk/total-
 read  writ
3406B 4573B
   0     0

平均负载 过去1,5,15分钟负载 ,0-0.8顺畅,1是满负载 超过5是快不行了

[root@node1 ~]# dstat -l  1 1
---load-avg---
 1m   5m  15m
   0 0.01 0.05
   0 0.01 0.05

网络io速度

[root@node1 ~]# dstat -n  1 1
-net/total-
 recv接收  send发送
   0     0
  60B  194B

进程状态

[root@node1 ~]# dstat -p  1 1
---procs---
run(运行) blk(阻塞 不可中断) new(新)
0.0   0 0.2
  0   0   0

socket状态

[root@node1 ~]# dstat --socket  1 1
------sockets------
tot tcp udp raw frg
574   4   3   0   0
574   4   3   0   0

tcp状态

[root@node1 ~]# dstat --tcp  1 1
----tcp-sockets----
lis监听  act确认   syn同步 tim等待 clo关闭
  4   2   0   0   0
  4   2   0   0   0

最高使用cpu

[root@node1 ~]# dstat --top-cpu  1 1
-most-expensive-
  cpu process
vmtoolsd     0.0

最多使用cpu时间

[root@node1 ~]# dstat --top-cputime  1 1
--highest-total--
 cputime process
vmtoolsd     1055
vmtoolsd      635

最多io

[root@node1 ~]# dstat --top-io  1 1
----most-expensive----
     i/o process
bash         34k 3198B
sshd: root@ 146B  180B

最多内存

[root@node1 ~]# dstat --top-mem  1 1
--most-expensive-
  memory process
firewalld   27.0M
firewalld   27.0M

最高延迟

[root@node1 ~]# dstat --top-latency  1 1
--highest-total--
 latency process
vmtoolsd       85
kworker/1:1  60

进程调优

非内核进程默认priority=120,为了方便读取很多场景使用20
nice值范围在-20-19
调优后 0<=priority<=39

增加优先级

[root@node1 yum.repos.d]# nice -n -5 htop   

Linux 进程管理

[root@node1 14511]# cat /proc/13828/sched
htop (13828, #threads: 1)
-------------------------------------------------------------------
......
prio                                         :                  115
.......

降低优先级

[root@node1 yum.repos.d]# nice -n 5 htop   
[root@node1 ~]# ps axo uname,pid,ppid,tty,pcpu,pmem,rtprio,priority,ni,vsz,rsz,s,start,cmd|grep  htop
root      13851   2368 pts/1     0.2  0.1      -  25   5 122432  2116 S 08:42:53 htop

Linux 进程管理

运行中的程序可以用renice进行调优

#renice  [-n]  NICE  PID...
[root@node1 ~]# renice -n -3  13851
13851 (进程 ID) 旧优先级为 5,新优先级为 -3