一、进程
1 进程和内存管理
1.1 进程和线程的区别
- 线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位
- 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线
- 进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号),某进程内的线程在其它进程不可见
- 调度和切换:线程上下文切换比进程上下文切换要快得多
1.2 查看进程中的线程
grep -i threads /proc/PID/status
1.3 进程使用内存管理问题
1.3.1 内存泄漏:Memory Leak
指程序中用malloc或new申请了一块内存,但是没有用free或delete将内存释放,导致这块内存一直处于占用状态
1.3.2 内存溢出:Memory Overflow
指程序申请了10M的空间,但是在这个空间写入10M以上字节的数据,就是溢出
1.3.3 内存不足:OOM(Out Of Memory)
原因
- 给应用分配内存太少:比如虚拟机本身可使用的内存(一般通过启动时的VM参数指定)太少
- 应用用的太多,并且用完没释放,浪费了。此时就会造成内存泄露或者内存溢出
使用的解决办法:
- 限制java进程的max heap,并且降低java程序的worker数量,从而降低内存使用
- 给系统增加swap空间
1.4 进程状态
- 运行态:running
- 就绪态:ready
- 睡眠态:分为两种,可中断:interruptable,不可中断:uninterruptable
- 停止态:stopped,暂停于内存,但不会被调度,除非手动启动
- 僵死态:zombie,僵尸态,结束进程,父进程结束前,子进程不关闭,杀死父进程可以关闭僵死态的子进程
范例:僵尸态
#父进程和子进程的创建
[root@rocky01 ~]# bash
[root@rocky01 ~]# echo $BASHPID
2267
[root@rocky01 ~]# echo $PPID
2209
[root@rocky01 ~]# pstree -p |grep 2209
|-sshd(948)-+-sshd(2195)---sshd(2208)---bash(2209)---bash(2267)-+-grep(2289)
#将父进程设为停止态
[root@rocky01 ~]# kill -19 2209
#杀死子进程,进入僵尸态
[root@rocky01 ~]# kill -9 2267
#可以看到子进程STAT为Z,表示为僵尸态
[root@rocky01 ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2267 0.0 0.0 0 0 pts/0 Z+ 20:25 0:00 [bash] <defunct>
root 2295 0.0 0.1 58752 3972 pts/1 R+ 20:27 0:00 ps aux
#解决方法
#方法一:恢复父进程
[root@rocky01 ~]# kill -19 2209
#方法二:杀死父进程
[root@rocky01 ~]# kill -9 2209</defunct>
范例:孤儿进程
[root@rocky01 ~]# (sleep 100 &)
[root@rocky01 ~]# pstree -p |grep sleep
|-sleep(2342)
1.5 LRU算法
LRU:Least Recently Used 近期最少使用算法(喜新厌旧),释放内存
1.6 IPC进程间通信
范例:利用管道文件实现 IPC
[root@rocky01 ~]# mkfifo test.fifo
[root@rocky01 ~]# ll test.fifo
prw-r--r-- 1 root root 0 Aug 15 20:51 test.fifo
[root@rocky01 ~]# echo Willoneday > test.fifo
#此时为等待读入状态,读取数据后才会调到命令提示符
#在另一个终端可以从文件中读取数据
[root@rocky01 ~]# cat test.fifo
Willoneday
1.7 进程优先级
- 系统优先级:0-139, 数字越小,优先级越高,各有140个运行队列和过期队列
- 实时优先级: 99-0 值最大优先级最高
- nice值:-20到19,对应系统优先级100-139或
2 进程管理和性能相关工具
Linux系统状态的查看及管理工具:
pstree
ps
pidof
pgrep
top
htop
glance
pmap
vmstat
dstat
kill
pkill
job
bg
fg
nohup
2.1 pstree 进程树
pstree 可以用来显示进程的父子关系,以树形结构显示
格式: pstree [ OPTION ] [ PID | USER ]
常用选项:
- -p 显示PID
- -T 不显示线程thread,默认显示线程
- -u 显示用户切换
- -H pid 高亮显示指定进程及其前辈进程
2.2 ps 进程信息
ps 即 process state,显示有关活动进程信息, Linux系统各进程的相关信息均保存在/proc/PID目录下的各文件中
支持三种选项:
- UNIX选项 如: -A -e
- GNU选项 如: –help
- BSD选项 如: a
格式: ps [ OPTION ]...
常用选项:
- a 选项包括所有终端中的进程
- x 选项包括不链接终端的进程
- u 选项显示进程所有者的信息
- f 选项显示进程树,相当于 –forest
- k sort 属性 对属性排序,属性前加 – 表示倒序
- o 属性… 选项显示定制的信息 pid、cmd、%cpu、%mem
- L 显示支持的属性列表
- -C cmdlist 指定命令,多个命令用,分隔
- -L 显示线程
- -e 显示所有进程,相当于-A
- -f 显示完整格式程序信息
- -F 显示更完整格式的进程信息
- -H 以进程层级格式显示进程相关信息
- -u userlist 指定有效的用户ID或名称
- -U userlist 指定真正的用户ID或名称
- -g gid或groupname 指定有效的gid或组名称
- -G gid或groupname 指定真正的gid或组名称
- -p pid 显示指pid的进程
- –ppid pid 显示属于pid的子进程
- -t ttylist 指定tty,相当于 t
- -M 显示SELinux信息,相当于Z
2.2.1 ps 输出信息
- C : ps -ef 显示列 C 表示cpu利用率
- VSZ: Virtual memory SiZe,虚拟内存集,线性内存
- RSS: ReSident Size, 常驻内存集
- STAT:进程状态
- R:running
- S: interruptable sleeping
- D: uninterruptable sleeping
- T: stopped
- Z: zombie
- +: 前台进程
- l: 多线程进程
- L:内存分页并带锁
- N:低优先级进程
范例:查看进程的特定属性
[root@rocky01 ~]# ps axo pid,cmd,%mem,%cpu
PID CMD %MEM %CPU
1 /usr/lib/systemd/systemd -- 0.2 0.0
2 [kthreadd] 0.0 0.0
3 [rcu_gp] 0.0 0.0
4 [rcu_par_gp] 0.0 0.0
6 [kworker/0:0H-events_highpr 0.0 0.0
9 [mm_percpu_wq] 0.0 0.0
...省略...
范例:按CPU利用率倒序排序
[root@rocky01 ~]# ps aux k -%cpu
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 927 0.2 0.8 568912 31904 ? Ssl Aug29 13:31 /usr/libexec/platform-python -Es /usr
root 22116 0.1 0.0 0 0 ? I 19:16 0:08 [kworker/0:1-mm_percpu_wq]
root 1 0.0 0.2 172768 11204 ? Ss Aug29 0:09 /usr/lib/systemd/systemd --switched-r
root 2 0.0 0.0 0 0 ? S Aug29 0:00 [kthreadd]
...省略...
面试题:找到未知进程的执行程序文件路径
[root@rocky01 ~]# ll /proc/16642/exe
lrwxrwxrwx 1 root root 0 Aug 29 23:24 /proc/16642/exe -> /data/httpd-2.4.54/bin/httpd
2.3 prtstat 查看进程信息
可以显示进程信息,来自于psmisc包
格式: prtstat [ options ] PID ..
选项: -r raw格式显示
[root@rocky01 ~]# prtstat -r 16642
pid: 16642 comm: httpd
state: S ppid: 1
pgrp: 16642 session: 16642
tty_nr: 0 tpgid: -1
flags: 404040 minflt: 307
cminflt: 0 majflt: 0
cmajflt: 0 utime: 290
stime: 331 cutime: 0
cstime: 0 priority: 20
nice: 0 num_threads: 1
itrealvalue: 0 starttime: 21243019
vsize: 119353344 rss: 1365
rsslim: 18446744073709551615 startcode: 4194304
endcode: 4967936 startstack: 140721176867168
kstkesp: 0 kstkeip: 0
wchan: 0 nswap: 0
cnswap: 0 exit_signal: 17
processor: 1 rt_priority: 0
policy: 0 delayaccr_blkio_ticks: 0
guest_time: 0 cguest_time: 0
2.4 设置和调整进程优先级
进程优先级调整
- 静态优先级:100-139
- 进程默认启动时的nice值为0,优先级为120
- 只有根用户才能降低nice值(提高优先性)
2.4.1 nice 以指定的优先级来启动进程
2.4.2 renice 可以调整正在执行中的进程的优先级
范例:使用方法
#查看优先级ni
[root@rocky01 ~]# ps axo pid,comm,ni
#nice
[root@rocky01 ~]# nice -n -10 ping 127.0.0.1
[root@rocky01 ~]# ps axo pid,cmd,nice |grep ping
 2118 ping 127.0.0.1              -10
 2120 grep --color=auto ping        0
#renice
[root@rocky01 ~]# renice -n -20 2118
2106 (process ID) old priority -10, new priority -20
[root@rocky01 ~]# ps axo pid,cmd,nice |grep ping
 2118 ping 127.0.0.1              -20
 2200 grep --color=auto ping        0
2.5 搜索进程
按条件搜索进程
- ps 选项 | grep ” “
- pgrep 按预定义的模式
- /sbin/pidof 按确切的程序名称查看pid
2.5.1 pgrep
格式: pgrep [options] pattern
常用选项:
- -u uid: effective user,生效者
- -U uid: real user,真正发起运行命令者
- -t terminal: 与指定终端相关的进程
- -l: 显示进程名
- -a: 显示完整格式的进程名
- -P pid: 显示指定进程的子进程
范例:使用方法
[root@rocky01 ~]# pgrep -lu root
2.5.2 pidof
格式: pidof [options] [program [...]]
选项: -x 按脚本名称查找pid
范例:使用方法
[root@rocky01 ~]# pidof httpd
16761 16645 16644 16643 16642
[root@rocky01 ~]# cat ping.sh
#!/bin/bash
ping 127.0.0.1
#ping.sh必须有shebang机制,否则pidof -x 也无法查找到
[root@rocky01 ~]# pidof -x ping.sh
19035
2.6 uptime 负载查询
/proc/uptime 包括两个值,单位 s
- 第一个值表示:系统启动时长
- 第二个值表示:空闲进程的总时长(按总的CPU核数计算)
uptime 和 w 显示以下内容
- 当前时间
- 系统已启动的时间
- 当前上线人数
- 系统平均负载(1、5、15分钟的平均负载,一般不会超过1,超过5时建议警报)
案例: 系统平均负载
指在特定时间间隔内运行队列中的平均进程数,通常每个CPU内核的当前活动进程数不大于3,那么系统的性能良好。如果每个CPU内核的任务数大于5,那么此主机的性能有严重问题
如:linux主机是1个双核CPU,当Load Average 为6的时候说明机器已经被充分使用
[root@rocky01 ~]# uptime
15:13:15 up 9:13, 1 user, load average: 0.04, 0.02, 0.00
[root@rocky01 ~]# w
15:14:30 up 9:14, 1 user, load average: 0.06, 0.03, 0.00
...省略...
[root@rocky01 ~]# top
top - 15:14:41 up 9:14, 1 user, load average: 0.05, 0.03, 0.00
...省略...
#load average:系统负载平均在过去的1、5和15分钟内忙不忙
#值一般超过5就会使系统变慢
2.7 mpstat 显示CPU相关统计
来自于sysstat包
#间隔2秒执行3此
[root@rocky01 ~]# mpstat 2 3
Linux 4.18.0-372.9.1.el8.x86_64 (rocky01) 09/02/2022 _x86_64_ (2 CPU)
10:34:06 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
10:34:08 PM all 0.00 0.00 0.25 0.00 0.25 0.25 0.00 0.00 0.00 99.25
10:34:10 PM all 0.00 0.00 0.00 0.00 0.25 0.00 0.00 0.00 0.00 99.75
10:34:12 PM all 0.00 0.00 0.25 0.00 0.00 0.00 0.00 0.00 0.00 99.75
Average: all 0.00 0.00 0.17 0.00 0.17 0.08 0.00 0.00 0.00 99.58
2.8 top、htop 查看进程实时状态
2.8.1 top
常见选项
- -d #指定刷新时间间隔,默认为3秒
- -b #全部显示所有进程
- -n #刷新多少次后退出
- -H #线程模式
排序:
- P:以占据的CPU百分比,%CPU
- M:占据内存百分比,%MEM
-
T:累积占据CPU时长,TIME
首部信息显示: -
uptime信息:l命令
- tasks及cpu信息:t命令
- cpu分别显示:1 (数字)
-
memory信息:m命令
-
退出命令:q
- 修改刷新时间间隔:s
- 终止指定进程:k
- 保存文件:W
2.8.2 htop
2.9 free 内存空间
向/proc/sys/vm/drop_caches中写入相应的修改值,会清理缓存。建议先执行sync(sync 命令将所有未写的系统缓冲区写到磁盘中,包含已修改的 i-node、已延迟的块 I/O 和读写映射文件)。执行echo1、2、3 至 /proc/sys/vm/drop_caches, 达到不同的清理目的
如果因为是应用有像内存泄露、溢出的问题时,从swap的使用情况是可以比较快速可以判断的,但通过执行free 反而比较难查看。但核心并不会因为内存泄露等问题并没有快速清空buffer或cache(默认值是0),生产也不应该随便去改变此值。
一般情况下,应用在系统上稳定运行了,free值也会保持在一个稳定值的。当发生内存不足、应用获取不到可用内存、OOM错误等问题时,还是更应该去分析应用方面的原因,否则,清空buffer,强制腾出free的大小,可能只是把问题给暂时屏蔽了。
排除内存不足的情况外,除非是在软件开发阶段,需要临时清掉buffer,以判断应用的内存使用情况;或应用已经不再提供支持,即使应用对内存的时候确实有问题,而且无法避免的情况下,才考虑定时清空buffer。
常用选项
- -b 以字节为单位
- -m 以MB为单位
- -g 以GB为单位
- -h 易读格式
- -o 不显示-/+buffers/cache行
- -t 显示RAM + swap的总和
- -s n 刷新间隔为n秒
- -c n 刷新n次后即退出
范例:清理缓存
[root@rocky01 ~]# cat /proc/sys/vm/drop_caches
0
[root@rocky01 ~]# free -h
total used free shared buff/cache available
Mem: 3.6Gi 238Mi 3.0Gi 8.0Mi 399Mi 3.2Gi
Swap: 3.9Gi 0B 3.9Gi
[root@rocky01 ~]# echo 3 > /proc/sys/vm/drop_caches
[root@rocky01 ~]# free -h
total used free shared buff/cache available
Mem: 3.6Gi 221Mi 3.3Gi 8.0Mi 112Mi 3.2Gi
Swap: 3.9Gi 0B 3.9Gi
2.10 pmap 进程对应的内存映射
格式: pmap [options] pid [...]
选项: -x: 显示详细格式的信息
#使用方法1
[root@rocky01 ~]# pmap -x PID
#使用方法2
[root@rocky01 ~]# cat /proc/PID/maps
2.11 vmstat 虚拟内存信息
格式: vmstat [options] [delay [count]]
[root@rocky01 ~]# vmstat
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 3415076 0 125060 0 0 45 9 112 181 0 1 99 0 0
procs
r:可运行(正运行或等待运行)进程的个数,和核心数有关
b:处于不可中断睡眠态的进程个数(被阻塞的队列的长度)
memory
swpd: 交换内存的使用总量
free:空闲物理内存总量
buffer:用于buffer的内存总量
cache:用于cache的内存总量
swap
si:从磁盘交换进内存的数据速率(kb/s)
so:从内存交换至磁盘的数据速率(kb/s)
io
bi:从块设备读入数据到系统的速率(kb/s)
bo: 保存数据至块设备的速率
system
in: interrupts 中断速率,包括时钟
cs: context switch     进程切换速率
cpu
us:Time spent running non-kernel code
sy: Time spent running kernel code
id: Time spent idle. Linux 2.5.41前,包括IO-wait time.
wa: Time spent waiting for IO.  2.5.41前,包括in idle.
st: Time stolen from a virtual machine.  2.6.11前, unknown.
2.12 iostat 统计CPU和设备IO信息
iostat 可以提供更丰富的IO性能状态数据
此工具由sysstat包提供
常用选项:
- -c 只显示CPU行
- -d 显示设备〈磁盘)使用状态
- -k 以千字节为为单位显示输出
- -t 在输出中包括时间戳
- -x 在输出中包括扩展的磁盘指标
`
[root@rocky01 ~]# iostat
Linux 4.18.0-372.9.1.el8.x86_64 (rocky01) 09/02/2022 x86_64 (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.07 0.01 0.65 0.02 0.00 99.25
Device tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sda 3.18 79.02 15.72 365404 72707
scd0 0.03 0.37 0.00 1693 0
dm-0 2.58 67.25 14.83 310990 68574
dm-1 0.02 0.48 0.00 2220 0
dm-2 0.20 0.59 0.44 2749 2048
Original: https://www.cnblogs.com/Willoneday/p/16524732.html
Author: 会不会有那么一天
Title: Linux(进阶篇)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581490/
转载文章受原作者版权保护。转载请注明原作者出处!