文章目录

  • 帮助
  • -e f
  • defunct的含义
  • -C
  • 进程优先级说明
  • kernel里优先级宏的注释
    • 参考
    • 线程的调度规则种类
    • Linux 样例
    • proc 里的优先级关系
    • Redhat 自己定义的优先级调整工具
    • chrt里的优先级
    • 优先级相应的问题
  • 进程状态说明

帮助

ps --help all
man ps
kernel 源代码
procps

-e f

注意e和f的空格

[root@host01 qcow2]# ps -e fPID TTY      STAT   TIME COMMAND2 ?        S      0:01 [kthreadd]3 ?        I<     0:00  \_ [rcu_gp]4 ?        I<     0:00  \_ [rcu_par_gp]6 ?        I<     0:00  \_ [kworker/0:0H-events_highpri]9 ?        I<     0:00  \_ [mm_percpu_wq]10 ?        S      2:19  \_ [ksoftirqd/0]11 ?        I      5:32  \_ [rcu_sched]12 ?        S      0:00  \_ [migration/0]13 ?        S      0:01  \_ [watchdog/0]14 ?        S      0:00  \_ [cpuhp/0]

defunct的含义

如果进程被标记为[defunct],说明进程已死掉(或者叫做僵尸进程);出现的原因是父进程没有将其正常销毁。在这个状态下,内核仍然会保留此进程的一些信息。如果父进程退出(exit),init会将其销毁。 (systemd, init - systemd system and service manager);
出现这种情况的场景之一是,如果进程发生coredump,所需的磁盘空间是6G,但是目前只有4G空间可用,进程可能会一直呆在这个状态。
https://www.linuxfordevices.com/tutorials/linux/defunct-zombie-process

-C

-C cmdlist
通过cmdlist,命令的名字来选择进程。NOTE: The command name is not the same as the command line. Previous versions of procps and the kernel truncated this command name to 15 characters. This limitation is no longer present in both. If you depended on matching only 15 characters, you may no longer get a match.

进程优先级说明

有关于进程/线程的优先级,已知的类别样式是多种多样,有unix标准定义的,有Linux内核定义的,动态的,静态的,实时,数字高优先级高,数字低优先级高。可以使用一句成语形容:鱼龙混杂。不容易看懂及维护。现将自己搜索到的,及自己的见解汇总一下。

kernel里优先级宏的注释

这个注释非常的有用,翻译如下:
优先级的范围是0到MAX_PRIO-1;然后这个范围非常两个范围:
有效的实时优先级是从0到MAX_RT_PRIO-1(注意中间的RT,如果将RT放到前面或者后面,可能会更容易方便看);
SCHED_NORMAL/SCHED_BATCH类型的任务级别是从,MAX_RT_PRIO到MAX_PRIO-1;优先级的实际作用是,越小优先级越大。小的p->prio的值代表高优先级。

/** Priority of a process goes from 0..MAX_PRIO-1, valid RT* priority is 0..MAX_RT_PRIO-1, and SCHED_NORMAL/SCHED_BATCH* tasks are in the range MAX_RT_PRIO..MAX_PRIO-1. Priority* values are inverted: lower p->prio value means higher priority.** The MAX_USER_RT_PRIO value allows the actual maximum* RT priority to be separate from the value exported to* user-space.  This allows kernel threads to set their* priority to a value higher than any user task. Note:* MAX_RT_PRIO must not be smaller than MAX_USER_RT_PRIO.*/#define MAX_USER_RT_PRIO    100
#define MAX_RT_PRIO     MAX_USER_RT_PRIO ,实时优先级的最大值是 用户实时的其实值,以确保kernel的优先级大于用户的#define MAX_PRIO      (MAX_RT_PRIO + NICE_WIDTH),最大值140
#define DEFAULT_PRIO        (MAX_RT_PRIO + NICE_WIDTH / 2),默认的120/** Convert user-nice values [ -20 ... 0 ... 19 ]* to static priority [ MAX_RT_PRIO..MAX_PRIO-1 ],* and back.*/
#define NICE_TO_PRIO(nice)  ((nice) + DEFAULT_PRIO)  120 +- nice值,就是nice到priority的转换
#define PRIO_TO_NICE(prio)  ((prio) - DEFAULT_PRIO)

,中间做了一项转换,因为用户层的优先级是从100到140,在实际使用时, 多有不便,所以将100-140的值,都减 100,转换成 0到39的值,方便计算。 所以我们在看进程的信息的时候,有各种值的出现; 所以要形成一个潜意识,实时与非实时的优先级一定要分开看; 而且实时的一定高于非实时。

/** 'User priority' is the nice value converted to something we* can work with better when scaling various scheduler parameters,* it's a [ 0 ... 39 ] range.*/
#define USER_PRIO(p)        ((p)-MAX_RT_PRIO)
,中间做了一项转换,因为用户层的优先级是从100到140,在实际使用时,
多有不便,所以将100-140的值,都减 100,转换成 0到39的值,方便计算。
所以我们在看进程的信息的时候,有各种值的出现;
所以要形成一个潜意识,实时与非实时的优先级一定要分开看;
而且实时的一定高于非实时。
#define TASK_USER_PRIO(p)   USER_PRIO((p)->static_prio)
#define MAX_USER_PRIO       (USER_PRIO(MAX_PRIO))

参考

https://www.zhihu.com/question/272086181; 这个链接里有一些基本概念说的清楚。
在include/linux/sched/prio.h 文件中,有关于优先级的宏定义。数字越小优先级越大。
https://www.cnblogs.com/hellokitty2/p/14547014.html
Documentation/scheduler/sched-design-CFS.txt

线程的调度规则种类

cls CLS scheduling class of the process. (alias policy, cls):
TS SCHED_OTHER 这个是 普通/默认的线程规则,CFS
FF SCHED_FIFO 实时的,先进先出,
RR SCHED_RR 实时的,Round robbin,循环使用
B SCHED_BATCH CFS,批处理风格的规则
ISO SCHED_ISO
IDL SCHED_IDLE
DLN SCHED_DEADLINE
? unknown value

Linux 样例

pri PRI priority of the process. Higher number means lower priority.
标准的系统priority是80,然后根据nice值做计算,nice -20,就是60.

F S UID          PID    PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
# ps -efl | grep abc
4 S root       31784    5292  0 -37   - - 1394596 hrtime 07:42 ?      00:03:06 abc
4 S root       31818    5292  0 -37   - - 1394596 hrtime 07:42 ?      00:03:12 abc
4 S root       31969    5292  0 -37   - - 1394596 hrtime 07:42 ?      00:03:07 abc
4 S root       32303    5292  0 -37   - - 1394596 hrtime 07:42 ?      00:03:06 abc

下面这个显示的 pri 和上面的显示的还不一样,为什么?不管怎么显示,只要是统一的,就行。

# ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm | grep abc31784   31784 FF      96   - 136   1  0.4 Sl   hrtimer_nanosl abc31818   31818 FF      96   - 136   3  0.4 Sl   hrtimer_nanosl abc31969   31969 FF      96   - 136   2  0.4 Sl   hrtimer_nanosl abc32303   32303 FF      96   - 136   0  0.4 Sl   hrtimer_nanosl abc

proc 里的优先级关系

<rms19-sc1-a:root>/proc/66673:
# cat stat
66673 (abc) S 2927 2927 2927 0 -1 1077952576 19425 34204 0 0 3802087 1253684 420 410 -29 0 53 0 6994883 4914745344 203010 18446744073709551615 268435456 346191408 140731001453680 0 0 0 16384 4096 17656 0 0 0 -1 2 28 1 0 0 0 268435456 346191408 400920576 140731001454404 140731001454419 140731001454419 140731001454554 0
这里 priority 是-29
实时的priority是28  这个值怎么来的
pri_baz 是71;和proc/abc/sched种prio 相同;这个值怎么来的<rms19-sc1-a:root>/proc/66673:
# ps -eLo tid,class,rtprio,ni,pri,pri_baz,comm | grep 6667366673 FF      28   -  68  71 ngss# cat sched  (proc_sched_show_task, 打印的是struct task_struct *p里的prio)
这个结构体里有int              prio;  int              static_prio;  静态设置的int              normal_prio;unsigned int            rt_priority;  实时进程的的abc(66673, #threads: 53)
-------------------------------------------------------------------
se.exec_start                                :     380776413.229469
se.vruntime                                  :             0.000000
se.sum_exec_runtime                          :             3.811779
se.nr_migrations                             :                    0
nr_switches                                  :                  359
nr_voluntary_switches                        :                  358
nr_involuntary_switches                      :                    1
se.load.weight                               :              1048576
se.avg.load_sum                              :                    0
se.avg.runnable_sum                          :                    0
se.avg.util_sum                              :                    0
se.avg.load_avg                              :                 1024
se.avg.runnable_avg                          :                  351
se.avg.util_avg                              :                  351
se.avg.last_update_time                      :       69372946195302
se.avg.util_est.ewma                         :                    0
se.avg.util_est.enqueued                     :                    0
policy                                       :                    1
prio                                         :                   71
clock-delta                                  :                   50
mm->numa_scan_seq                            :                    0
numa_pages_migrated                          :                    0
numa_preferred_nid                           :                   -1
total_numa_faults                            :                    0
current_node=0, numa_group_id=0
numa_faults node=0 task_private=0 task_shared=0 group_private=0 group_shared=0

Redhat 自己定义的优先级调整工具

这个工具不太好用;不知道用的人多不多。
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/performance_tuning_guide/sec-tuna-tuning-tasks-with-tuna
上面链接里有提到以下:
Set the rt_priority in the range 1–99. 1 is the lowest priority, and 99 is the highest priority.
说1是优先级最低的一个。和Kernel里说的又不一样。其实这个工具可能中间做了转换,但是这种转换有时候会让人迷惑。为了避免迷惑,我们可能需要从不同的角度来看这个优先级;如果是用户,因为要使用这些工具,需要安装低优先级低数字的逻辑。
而如果是kernel开发者,又要转变思维,低数字高优先级。
这个工具及chrt设置的priority是和实际代码里的是反着的,可以查看 /proc//sched 文件来 确认。

chrt里的优先级

这个工具只能调实时进程的优先级。
#taskset -c 1 chrt -f 40 ./test_prog
这里看着也是数字越大 ,优先级越高。
这个工具chrt设置的priority是和实际代码里的是反着的,可以查看 /proc//sched 文件来 确认。

chrt --max
HED_OTHER min/max priority      : 0/0
SCHED_FIFO min/max priority     : 1/99
SCHED_RR min/max priority       : 1/99
SCHED_BATCH min/max priority    : 0/0
SCHED_IDLE min/max priority     : 0/0
SCHED_DEADLINE min/max priority : 0/0

优先级相应的问题

https://access.redhat.com/solutions/129453
如果实时进程设置的规则是FF,而且优先级很高,而且消耗CPU很高的情况下,可能遇到上面这种状况,导致用户console输入无反应。
sysrq-t will show the runqueues. You can use this to determine if the realtime task is starving the kernel threads.

在内核里有专门的yield函数及sched_yield。 库函数里也有sched_yield;主动让出CPU的使用。普通的进程可能就会到达非-active的task list列表,而实时的进程还是回到实时的队列里,等待下一次调度。所以优先级还是原来的优先级《Linux Kernel Development》P-67
/usr/include/sched.h:extern int sched_yield (void) __THROW;

进程状态说明

关于不可中断的休眠的解释
https://eklitzke.org/uninterruptible-sleep
https://lwn.net/Articles/288056/

进程状态代码:下面是s, stat 和 state 输出的限定词 specifiers (表头"STAT" or "S"):D    uninterruptible sleep (usually IO) 、不可中断休眠,一般是 IO操作I    Idle kernel thread,空闲内核线程R    running or runnable (on run queue),正在运行,或者可以运行(已经在可运行队列里了)S    interruptible sleep (waiting for an event to complete),可被打断的休眠(正在等待一个事件的结束)T    stopped by job control signal ,job控制信号中止的线程t    stopped by debugger during the tracing;跟踪器停止的进程W    paging (not valid since the 2.6.xx kernel)   无效状态X    dead (should never be seen) 无效状态Z    defunct ("zombie") process, terminated but not reaped by its parent,已经终结,但是未被收集的进程For BSD formats and when the stat keyword is used, additional characters may be displayed:<    high-priority (not nice to other users)N    low-priority (nice to other users)L    has pages locked into memory (for real-time and custom IO)s    is a session leaderl    is multi-threaded (using CLONE_THREAD, like NPTL pthreads do)+    is in the foreground process group

Linux:命令:ps、进程状态,线程优先级/priority; defunct相关推荐

  1. Linux命令 - ps命令

    Linux命令 - ps命令   ps是process status的缩写,在Linux中 ps 命令用来列出系统中当前运行的那些进程.ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的 ...

  2. linux命令ps -aux|grep xxx详解

    linux命令ps -aux|grep xxx详解 要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程, 而ps命令(Process Status)就是最基本同时也是非常强大 ...

  3. linux里netstat与ps,linux命令——ps和netstat

    linux命令--ps和netstat 2017年03月14日 23:34:27 漫步111 阅读数 2282 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn ...

  4. 【多线程】线程的引入,创建线程的方式,设置线程名字、获取名字,线程优先级priority,加入休眠的方法,,后台线程,礼让线程,Join,中断线程,某电影院,共有100张票线程流程图,3售票窗口,

    多线程 1.线程的引入 进程: 正在运行的程序,是系统进行资源分配和调用的独立单位.每一个进程都有它自己的内存空间和资源. 线程: 是进程的单个顺序控制流,或者说就是一个单独执行的路径 一个进程如果只 ...

  5. linux命令ps详解

    原文地址:http://apps.hi.baidu.com/share/detail/32573968 名称:ps 使用权限:所有使用者 使用方式:ps [options] [--help] 说明:显 ...

  6. linux 命令 ps的作用,Linux之ps命令

    1.功能简介 报告当前进程[root@vms002 /]# whatis ps ps (1)               - report a snapshot of the current proc ...

  7. linux下java转储线程_Java线程转储prio值与linux上的真实线程优先级不对应?

    我打算在我的 Java代码中使用线程优先级. 应用程序应在我的 Linux系统上运行: >uname -a Linux 3.0.0-15-generic #26-Ubuntu SMP x86_6 ...

  8. linux xxx命令,linux命令ps aux|grep xxx详解

    对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程, 而ps命令(Process Status)就是最基本同时也是非常强大的进程查看命令. 使用该命令 可以确定有哪些进程正在运 ...

  9. Linux 命令 ps

    Linux中的ps命令是Process Status的缩写.ps命令用来列出系统中当前运行的那些进程. ps命令列出的是当前进程的快照,即当前的进程情况.若需要动态显示进程信息,则可使用top命令 L ...

  10. vyos 的命令行执行的优先级 priority

    vyos 的命令行执行的优先级 Defined how early in the commit process the node is processed. Use it if your node m ...

最新文章

  1. 头像秒变像素风,宅男大叔自学AI打造大师级水准,火爆推特
  2. 【瞎扯】About Me
  3. 百度获取图片 json格式解析
  4. Python 主成分分析PCA
  5. 类似select下拉选择框同时又支持手动输入的元素 datalist 介绍。
  6. get和post方式提交中文乱码问题解决方案
  7. vue list数组合并和插入数据
  8. CF1047C Enlarge GCD
  9. 数据库系统原理——概述
  10. 爬虫笔记9:session在突破12306图片验证中的作用
  11. 声道测试音频_一音成佛的尺八音色,电吹管的单声道和双声道录音对比(2)
  12. HTML标签marquee实现滚动效果/跑马灯/弹幕等
  13. Mqtt ----心跳机制 长链接 ping
  14. mysql查询结果升序_MySQL ORDER BY:对查询结果进行排序
  15. windows配置java环境
  16. python网络图片下载---跟我一起爬王者农药皮肤吧
  17. 什么是CRM系统 企业如何选择合适的CRM系统
  18. 安静,是一个人最有力量的时候
  19. STM-32:ADC模数转换器—ADC单通道转换/ADC多通道转换
  20. IDEA开发工具调试技巧(极大提升开发效率)

热门文章

  1. Android系统修改汇总(MTK)
  2. oracle 数据全备份,oracle数据库全备份和增量备份
  3. CIFS链接以及常见操作
  4. python中对于bool布尔值的取反
  5. 用好Windows命令 识别木马蛛丝马迹
  6. guns框架企业版添加模块
  7. 《网页设计基础——HTML常用标签》
  8. 在单页应用中使用WebWork
  9. java调试器jdb_Java调试教程-Java调试器(JDB)概述
  10. 易趣通网络电话 最新测试版本 怎么用