进程管理

本文介绍了Linux系统中的进程管理,包括进程相关概念、内存不足的解决方案、内核参数设置,以及进程状态转换。还探讨了进程管理和性能相关的工具,如pstree、ps、top、htop等,并讲解了如何查看和调整进程优先级。此外,文章还涵盖了计划任务,包括一次性任务和周期性计划任务的设置与管理。
摘要由CSDN通过智能技术生成

进程,系统性能和计划任务

查看进程中的线程:
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  #不可中断睡眠
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值