目录
一、查看进程
1. 程序
2. 进程
2.1 概述
2.2 进程的特征
2.3 进程使用内存的问题
2.4 进程的状态
2.5 进程的优先级os
2.6 进程的分类
2.7 进程与线程
二、控制进程
1. ps
1.1 概述
1.2 常用选项
1.3 字段说明
1.4 父子关系与排序
1.5 自定义显示字段
2. top
2.1 概述
2.2 进程的性能(上半部分)
2.3 进程的状态(下半部分)
2.4 top常用内部指令
2.5 top使用技巧
3. pgrep
4. pstree
5. lsof
程序是特定任务的一串代码,是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具。用于描述进程要完成的功能,是控制进程执行的指令集。
进程是运行中的程序的一个副本,是被载入内存的一个指令集合,是资源分配的单位,进程是有生命周期的。centos6及之前由init串行启动管理进程;从centos7以后为systemd并行启动管理进程。进程都由其父进程创建,fork(),centos最初的父进程是systemd(pid=1)。
[root@localhost ~]# bash
[root@localhost ~]# pstree -p | grep bash
|-sshd(1190)-+-sshd(1262)---bash(2095)---bash(3282)-+-grep(3408)
| `-sshd(3362)---bash(3372)
bash(2095)和bash(3282)为父子关系,bash(2095)和bash(3372)为兄弟关系。
内存不足:OOM
OOM 即 Out Of Memory,“内存用完了”,在情况在java程序中比较常见。系统会选一个进程将之杀死,在日志messages中看到相关的提示。
系统中的两种优先级:在top中显示的优先级有两个,PR值和nice值
Nice Level优先级,Nice即NI;PR系统内置的优先级,不能控制;PR=NI+20。启动进程时,通常会继承父进程的nice级别,默认为0。
NI:实际nice值
PR(+-20):将nice级别显示为映射到更大优先级别队列,-20映射到0,+19映射到39
特性:
nice值越大:表示优先级越低,例如 +19
nice值越小:表示优先级越高,例如 -20
优先级查看与管理:
[root@localhost ~]# ps axo pid,comm,ni #显示pid,进程名,nice值
[root@localhost ~]# sleep 8000 & #sleep命令可以用来将目前动作延迟一段时间,&后台运行
[1] 2675
[root@localhost ~]# ps axo pid,command,nice | grep sleep
2675 sleep 8000 0
2683 sleep 60 0 #系统自带计时器
2685 grep --color=auto sleep 0 #搜索程序本身
[root@localhost ~]# renice -n -20 2675 #renice重置现有优先级
2675 (进程 ID) 旧优先级为 0,新优先级为 -20
[root@localhost ~]# ps axo pid,command,nice | grep sleep
2675 sleep 8000 -20
2694 sleep 60 0
2697 grep --color=auto sleep 0
[root@localhost ~]# nice -n -10 sleep 6000 & #启动指定nice级别的进程
[2] 2826
[root@localhost ~]# ps axo pid,command,nice | grep sleep
2675 sleep 8000 -20
2824 sleep 60 0
2826 sleep 6000 -10 #nice值为-10
2828 grep --color=auto sleep 0
线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。
Q:如何确认一个程序是单线程还是多线程?
查看改程序的详细状态
[root@localhost ~]# cat /proc/该程序的pid/status
[root@localhost ~]# grep -i threads /proc/该程序的pid/status
[root@localhost ~]# prtstat 该程序的pid
ps命令可以静态查看进程当前状态,默认显示当前终端中的进程。
[root@localhost ~]# ps aux | head -n3
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 128384 6976 ? Ss 12:19 0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 12:19 0:00 [kthreadd]
ps aux #如果看到STAT为Z,表示为僵尸态。Q:如何过滤僵尸进程?
[root@localhost ~]# ps aux | grep -v grep | grep Z
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
[root@localhost ~]# ps -ef | head -n 3
#显示列C表示cpu利用率,查看进程父子关系PID(自己的身份证号)PPID(父系)
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 15:11 ? 00:00:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0 0 15:11 ? 00:00:00 [kthreadd]
[root@localhost ~]# ps aux --sort %cpu | head -n 3
#升序查看cpu利用率,或者ps aux k %cpu | head -n 3
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 128384 7112 ? Ss 15:11 0:03 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 15:11 0:00 [kthreadd]
[root@localhost ~]# ps aux --sort -%cpu | head -n 3
#降序查看cpu利用率,或者ps aux k -%cpu | head -n 3
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 721 0.2 0.2 295564 5300 ? Ssl 15:11 0:26 /usr/bin/vmtoolsd
root 415 0.1 0.0 0 0 ? S 15:11 0:14 [xfsaild/dm-0]
[root@localhost ~]# ps axo user,pid,ppid,%mem,command | head -3
#自定义显示用户名,pid,父pid,内存占用率,进程名前三行信息
USER PID PPID %MEM COMMAND
root 1 0 0.3 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0 0.0 [kthreadd]
top命令可以动态地持续监听进程地运行状态,与此同时,该命令还提供了一个交互界面,用户可以根据需要,人性化地定制自己的输出,进而更清楚地了进程的运行状态。
[root@localhost ~]# top | head
top - 19:52:14 up 4:40, 1 user, load average: 0.00, 0.01, 0.05
Tasks: 172 total, 1 running, 171 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 1863028 total, 928920 free, 530992 used, 403116 buff/cache
KiB Swap: 4194300 total, 4194300 free, 0 used. 1155968 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5728 root 20 0 162100 2224 1536 R 6.2 0.1 0:00.01 top
1 root 20 0 128384 7112 4220 S 0.0 0.4 0:04.13 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.05 kthreadd
第一行:程序名-系统时间,运行时间,登录用户数,CPU负载1分钟5分钟15分钟(cpu负载三个时间点的平均值)
第二行:任务总进程数172,运行数1,睡眠数171,停止数0,僵死数0
第三行:cpu使用占比,us用户 ,sy系统,ni优先级,id空闲,wa等待处理所耗时间,hi硬件耗时,si软件耗时,st虚拟机
第四行:物理内存K,total总共, free空闲,userd使用,buff写缓存、cache读缓存硬盘内容,缓存多了会造成卡顿
缓冲(buffer)和缓存(cache)的区别:
缓存(cache)是在读取硬盘中的数据时,把最常用的数据保存在内存的缓存区中,再次读取该数据时,就不去硬盘中读取了,而在缓存中读取
缓冲(buffer)是在向硬盘写入数据时,先把数据放入缓冲区,然后再一起向硬盘写入,把分散的写操作集中进行,减少磁盘碎片和硬盘的反复寻道,从而提高系统性能
第五行:虚拟内存(交换分区),当内存不够时,将硬盘空间当作内存使用
PID,USER,%CPU,%MEM同上“1.3”,介绍见前部分
VIRT:virtual memory usage 虚拟内存
RES:resident memory usage 常驻内存
SHR:shared memory 共享内存;除了自身进程的共享内存,也包括其他进程的共享内存
top:回车,立刻刷新。按z彩色显示,按F,通过光标设置
top -d 1:每1秒刷新
top -d 1 -p pid:查看指定进程的动态信息
top -d 1 -p pid1,pid2:查看多个指定进程的动态信息
Q:cpu利用率高如何排查?
使用top或者ps aux命令查看进程,另外w和vmstat命令也可以查看
查看指定的进程
[root@localhost ~]# pgrep -l "log" #显示进程名
413 xfs-log/dm-0
630 xfs-log/sda1
730 abrt-watch-log
737 abrt-watch-log
754 systemd-logind
1195 rsyslogd
[root@localhost ~]# pidof bash #根据进程名找pid号
4884 812 #pid4884
Q:当前系统root用户一共运行了多少进程 ?
[root@localhost ~]# pgrep -U root | wc -l
129
以树形结构列出进程信息
[root@localhost ~]# pstree -p 1 | head -n1 #查看进程号为1的进程
systemd(1)-+-ModemManager(717)-+-{ModemManager}(733)
[root@localhost ~]# pstree root | head -n5 #查看用户lisi的进程
systemd-+-ModemManager---2*[{ModemManager}]
|-NetworkManager---2*[{NetworkManager}]
|-VGAuthService
|-2*[abrt-watch-log]
|-abrtd
lsof命令,“list opened files”的缩写,直译过来就是列举系统中已经被打开的文件。通过lsof 命令,我们就可以根据文件找到对应的进程信息,也可以根据进程信息找到进程打开的文件。
选项 | 功能 |
-c 字符串 | 只列出以字符串开头的进程打开的文件 |
+d 目录名 | 列出某个目录中所有被进程调用的文件 |
-u 用户名 | 只列出某个用户的进程打开的文件 |
-p pid | 列出某个 PID 进程打开的文件 |
[root@localhost ~]# lsof | head -n5 #查询系统中所有进程调用的文件
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 253,0 248 64 /
systemd 1 root rtd DIR 253,0 248 64 /
systemd 1 root txt REG 253,0 1632776 34040407 /usr/lib/systemd/systemd
systemd 1 root mem REG 253,0 20064 153450 /usr/lib64/libuuid.so.1.3.0