进程,系统性能和计划任务
查看进程中的线程:
cat /proc/PID/status |grep -i threads
进程相关概念
Page Frame: 页框,用存储页面数据,存储Page 4k
[root@centos8|2|~]#getconf -a |grep -i size
PAGESIZE 4096
PAGE_SIZE 4096
SSIZE_MAX 32767
_POSIX_SSIZE_MAX 32767
_POSIX_THREAD_ATTR_STACKSIZE 200809
FILESIZEBITS 64
POSIX_ALLOC_SIZE_MIN 4096
POSIX_REC_INCR_XFER_SIZE
POSIX_REC_MAX_XFER_SIZE
POSIX_REC_MIN_XFER_SIZE 4096
LEVEL1_ICACHE_SIZE 32768
LEVEL1_ICACHE_LINESIZE 64
LEVEL1_DCACHE_SIZE 32768
LEVEL1_DCACHE_LINESIZE 64
LEVEL2_CACHE_SIZE 262144
LEVEL2_CACHE_LINESIZE 64
LEVEL3_CACHE_SIZE 6291456
LEVEL3_CACHE_LINESIZE 64
LEVEL4_CACHE_SIZE 0
LEVEL4_CACHE_LINESIZE 0
内存不足解决方法
设置内核参数(不推荐),不允许内存申请过量:
echo "2" > /proc/sys/vm/overcommit_memory
echo "80" > /proc/sys/vm/overcommit_ratio
echo 2 > /proc/sys/vm/panic_on_oom
说明:
Linux默认是允许memory overcommit的,只要你来申请内存我就给你,寄希望于进程实际上用不到那么多内存,但万一用到那么多了呢?Linux设计了一个OOM killer机制挑选一个进程出来杀死,以腾出部分内存,如果还不够就继续杀…也可通过设置内核参数 vm.panic_on_oom 使得发生OOM时自动重启系统。这都是有风险的机制,重启有可能造成业务中断,杀死进程也有可能导致业务中断。所以Linux 2.6之后允许通过内核参数vm.overcommit_memory 禁止memory overcommit。
vm.overcommit_memory 接受三种取值:
0 – Heuristic overcommit handling. 这是缺省值,它允许overcommit,但过于明目张胆的
overcommit会被拒绝,比如malloc一次性申请的内存大小就超过了系统总内存。Heuristic的意思是
“试探式的”,内核利用某种算法猜测你的内存申请是否合理,它认为不合理就会拒绝overcommit。
1 – Always overcommit. 允许overcommit,对内存申请来者不拒。内核执行无内存过量使用处理。
使用这个设置会增大内存超载的可能性,但也可以增强大量使用内存任务的性能。
2 – Don’t overcommit. 禁止overcommit。 内存拒绝等于或者大于总可用 swap 大小以及
overcommit_ratio 指定的物理 RAM 比例的内存请求。如果您希望减小内存过度使用的风险,这个设置
就是最好的。
vm.panic_on_oom 决定系统出现oom的时候,要做的操作。接受的三种取值如下:
0 - 默认值,当出现oom的时候,触发oom killer
1 - 程序在有cpuset、memory policy、memcg的约束情况下的OOM,可以考虑不panic,而是启动OOM
killer。其它情况触发 kernel panic,即系统直接重启
2 - 当出现oom,直接触发kernel panic,即系统直接重启
vm.overcommit_ratio 是内核参数,缺省值是50,表示物理内存的50%。如果你不想使用比率,也可以
直接指定内存的字节数大小,通过另一个内核参数 vm.overcommit_kbytes 即可;
如果使用了huge pages,那么需要从物理内存中减去,公式变成:
CommitLimit = ([total RAM] – [total huge TLB RAM]) * vm.overcommit_ratio / 100 +
swap
/proc/meminfo中的 Committed_AS 表示所有进程已经申请的内存总大小,(注意是已经申请的,不
是已经分配的),如果 Committed_AS 超过 CommitLimit 就表示发生了 overcommit,超出越多表示
overcommit 越严重。Committed_AS 的含义换一种说法就是,如果要绝对保证不发生OOM (out of
memory) 需要多少物理内存。
单次申请的内存大小不能超过以下值,否则本次申请就会失败。
free memory + free swap + pagecache的大小 + SLAB
vm.overcommit_memory=2 禁止overcommit,那么怎样才算是overcommit呢?
kernel设有一个阈值,申请的内存总数超过这个阈值就算overcommit,在/proc/meminfo中可以看到
这个阈值的大小:
grep -i commit /proc/meminfo
CommitLimit: 5967744 kB
Committed_AS: 5363236 kB
CommitLimit 就是overcommit的阈值,申请的内存总数超过CommitLimit的话就算是overcommit。
此值通过内核参数vm.overcommit_ratio或vm.overcommit_kbytes间接设置的,公式如下:
CommitLimit = (Physical RAM * vm.overcommit_ratio / 100) + Swap
范例:
[root@centos8 ~]#cat /proc/sys/vm/panic_on_oom
0
[root@centos8 ~]#cat /proc/sys/vm/overcommit_memory
0
[root@centos8 ~]#cat /proc/sys/vm/overcommit_ratio
50
[root@centos8 ~]#grep -i commit /proc/meminfo
CommitLimit: 3021876 kB
Committed_AS: 340468 kB
进程的基本状态:
创建状态:
进程在创建时需要申请一个空白PCB(process control block进程控制块),向其中填写控制和管理进程的信息,完成资源分配。如果创建工作无法完成,比如资源无法满足,就无法被调度运行,把此时进程所处状态称为创建状态
就绪状态:
进程已准备好,已分配到所需资源,只要分配到CPU就能够立即运行
执行状态:进程处于就绪状态被调度后,进程进入执行状态
阻塞状态:
正在执行的进程由于某些事件(I/O请求,申请缓存区失败)而暂时无法运行,进程受到阻塞。在满足请求时进入就绪状态等待系统调用
终止状态:
进程结束,或出现错误,或被系统终止,进入终止状态。无法再执行
状态之间转换六种情况
运行——>就绪:1,主要是进程占用CPU的时间过长,而系统分配给该进程占用CPU的时间是有限的;
2,在采用抢先式优先级调度算法的系统中,当有更高优先级的进程要运行时,该进程就被迫让出CPU,
该进程便由执行状态转变为就绪状态
就绪——>运行:运行的进程的时间片用完,调度就转到就绪队列中选择合适的进程分配CPU
运行——>阻塞:正在执行的进程因发生某等待事件而无法执行,则进程由执行状态变为阻塞状态,如发生了I/O请求
阻塞——>就绪:进程所等待的事件已经发生,就进入就绪队列
以下两种状态是不可能发生的:
阻塞——>运行:即使给阻塞进程分配CPU,也无法执行,操作系统在进行调度时不会从阻塞队列进行
挑选,而是从就绪队列中选取
就绪——>阻塞:就绪态根本就没有执行,谈不上进入阻塞态
进程的更多状态:
运行态:running
就绪态:ready
睡眠态:分为两种,可中断:interruptable,不可中断:uninterruptable
停止态:stopped,暂停于内存,但不会被调度,除非手动启动
僵死态:zombie,结束进程,父进程结束前,子进程不关闭
进程优先级
进程优先级:
系统优先级:数字越小,优先级越高
0-139(CentOS 4,5),各有140个运行队列和过期队列
0-98,99(CentOS 6)
实时优先级: 99-0 值最大优先级最高
nice值:-20到19,对应系统优先级100-139或99
Big O:时间(空间)复杂度,用时(空间)和规模的关系
O(1), O(logn), O(n)线性, O(n^2)抛物线, O(2^n)
2 进程管理和性能相关工具
Linux系统状态的查看及管理工具:
pstree
ps
pidof
pgrep
top,
htop
glance
pmap
vmstat
dstat
kill
pkill
job
bg
fg
nohup
pstree进程树
pstree 可以用来显示进程的父子关系,以树形结构显示
格式:
pstree [OPTION] [ PID | USER ]
常用选项:
-p 显示PID
-T 不显示线程thread,默认显示线程
-u 显示用户切换
-H pid 高度指定进程及其前辈进程
[root@centos8|6|~]#pstree -p
systemd(1)─┬─ModemManager(849)─┬─{
ModemManager}(857)
│ └─{
ModemManager}(875)
├─NetworkManager(922)─┬─{
NetworkManager}(931)
│ └─{
NetworkManager}(936)
├─VGAuthService(865)
├─accounts-daemon(1002)─┬─{
accounts-daemon}(1010)
│ └─{
accounts-daemon}(1014)
├─alsactl(861)
├─atd(1025)
├─auditd(818)─┬─sedispatch(821)
│ ├─{
auditd}(820)
│ └─{
auditd}(822)
├─automount(1031)─┬─{
automount}(1046)
│ ├─{
automount}(1047)
│ ├─{
automount}(1094)
│ └─{
automount}(1112)
├─avahi-daemon(844)───avahi-daemon(890)
[root@centos8|8|~]#pstree lin
bash
[root@centos8|9|~]#pstree -T
systemd─┬─ModemManager
├─NetworkManager
├─VGAuthService
├─accounts-daemon
├─alsactl
├─atd
├─auditd───sedispatch
├─automount
├─avahi-daemon───avahi-daemon
├─bluetoothd
├─boltd
├─chronyd
├─colord
├─crond
├─cupsd
├─dbus-daemon
[root@centos8|10|~]#pstree -pT
systemd(1)─┬─ModemManager(849)
├─NetworkManager(922)
├─VGAuthService(865)
├─accounts-daemon(1002)
├─alsactl(861)
├─atd(1025)
├─auditd(818)───sedispatch(821)
├─automount(1031)
├─avahi-daemon(844)───avahi-daemon(890)
├─bluetoothd(867)
├─boltd(2757)
├─chronyd(871)
├─colord(3078)
├─crond(1020)
├─cupsd(939)
├─dbus-daemon(852)
[root@centos8|11|~]#pstree -u
systemd─┬─ModemManager───2*[{
ModemManager}]
├─NetworkManager───2*[{
NetworkManager}]
├─VGAuthService
├─accounts-daemon───2*[{
accounts-daemon}]
├─alsactl
├─atd
├─auditd─┬─sedispatch
│ └─2*[{
auditd}]
├─automount───4*[{
automount}]
├─avahi-daemon(avahi)───avahi-daemon
├─bluetoothd
├─boltd───2*[{
boltd}]
进程信息 PS
ps 即process state,可以进程当前状态的快照,默认显示当前终端中的进程,Linux系统各进程的相关
信息均保存在/proc/PID目录下的各文件中
常用选项:
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
ps输出属性
C : ps -ef 显示列 C 表示cpu利用率
VSZ: Virtual memory SiZe,虚拟内存集,线性内存
RSS: ReSident Size, 常驻内存集
STAT:进程状态
R:running
S: interruptable sleeping #可中断睡眠
D: uninterruptable sleeping #不可中断睡眠