目录
程序是特定任务的一串代码,是一组计算机能识别和执行的指令,运行于电子计算机上,满足人们某种需求的信息化工具。用于描述进程要完成的功能,是控制进程执行的指令集。
进程是运行中的程序的一个副本,是被载入内存的一个指令集合,是资源分配的单位,进程是有生命周期的。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值
bash1创建睡眠示例
[root@localhost ~]# sleep 8000 #sleep命令可以用来将目前动作延迟一段时间
bash2修改优先级
[root@localhost ~]# ps axo pid,command,nice | grep sleep
4029 sleep 8000 0
4037 sleep 60 0
4039 grep --color=auto sleep 0
[root@localhost ~]# renice -n -20 4029 #renice重置优先级
4029 (进程 ID) 旧优先级为 0,新优先级为 -20
[root@localhost ~]# ps axo pid,command,nice | grep sleep
4029 sleep 8000 -20
4047 sleep 60 0
4050 grep --color=auto sleep 0
线程是程序执行中一个单一的顺序控制流程,是程序执行流的最小单元,是处理器调度和分派的基本单位。一个进程可以有一个或多个线程,各个线程之间共享程序的内存空间(也就是所在进程的内存空间)。
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:查看多个指定进程的动态信息
查看指定的进程
[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
根据进程名找pid号
[root@localhost ~]# pidof bash
4884 812 #pid4884
以树形结构列出进程信息
[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 | more | 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
?