top/htop内容的含义

uptime

uptime命令显示了load avg,它其实是读取的/proc/uptime文件:

  • /proc/uptime 文件
cat /proc/uptime
9592411.58 9566042.33

第一个是系统启动了多久(单位s),第二个意思是系统启动以来,cpu idle花费的时间(单位s)。多核机器上,第二个可能大于第一个,因为他是每个核心idle的总和。
怎么才能知道uptime 真的是读取这个文件呢?想办法查看一下,这里可以用strace :

[root@localhost ~]# strace uptime 2>&1 | grep open
open("/proc/uptime", O_RDONLY)          = 3
open("/var/run/utmp", O_RDONLY|O_CLOEXEC) = 4
open("/proc/loadavg", O_RDONLY)         = 4

strace 命令在stderr上打印了uptime的系统调用情况,在stdout上打印命令的原始输出。strace -e open uptime 可以起到和grep open相同的作用。uptime只是格式化输出了/proc的内容。如果是脚本里想要uptime值,自己读取/proc/uptime或许更方便一些。

Load average

[root@localhost ~]# cat /proc/loadavg
0.00 0.01 0.05 2/374 40656

前三列没什么好说的,第四列是当前有多少个进程,和多少个进程处于running或者runable,最后一列是最新的被分配的pid。running的意思是,当前进程正在物理cpu上运行;runable的意思是,它在等系统给他分配cpu时间片。

[root@localhost ~]# sleep 10 &
[1] 40674
[root@localhost ~]# sleep 10 &
[2] 40675
[root@localhost ~]# sleep 10 &
[3] 40676

[root@localhost ~]# cat /proc/loadavg
0.00 0.01 0.05 2/375 40677

可以看到,每运行一次,pid就+1,cat /proc/loadavg最后一列值可以证明。
证明第四列是当前正在运行的进程数:

[root@localhost ~]# cat /proc/loadavg
0.05 0.04 0.05 2/374 40717

当前有两个进程在运行(其中一个是当前的cat,另一个是vmware的vm-tool进程)

[root@localhost ~]# cat /dev/urandom > /dev/null &
[1] 40718
[root@localhost ~]# cat /proc/loadavg
0.09 0.04 0.05 3/375 40719

创建一个无意义,但不断运行的进程(随机生产些数据,然后写入/dev/null),第四列 正在运行的进程数+1(另外两个运行中的进程和上面同理)。
load数量指进程状态处在 :正在运行、等待运行、和不可中断(后面对这个状态做解释)的进程数。load avg就是过去1min,5min,15min load数量的平均数,但这个解析是简化版本,其实并不太对。直接引用维基百科上的解释:

Mathematically speaking, all three values always average all the system load since the system started up. They all decay exponentially, but they decay at different speed. Hence, the 1-minute load average will add up 63% of the load from last minute, plus 37% of the load since start up excluding the last minute. Therefore, it's not technically accurate that the 1-minute load average only includes the last 60 seconds activity (since it still includes 37% activity from the past), but that includes mostly the last minute.

关于不可中断状态:

进程 struct task_struct
state 字段为TASK_UNINTERRUPTIBLE,进程陷入了不能被中断的阻塞操作,无视信号。 What is an uninterruptable process?
http://stackoverflow.com/questions/223644/what-is-an-uninterruptable-process

另外一个关于不可中断状态的解释还不错:https://yq.aliyun.com/articles/8902

内核的某些处理流程是不能被打断的。如果响应异步信号,程序的执行流程中就会被插入一段用于处理异步信号的流程(这个插入的流程可能只存在于内核态,也可能延伸到用户态),于是原有的流程就被中断了

如果是单核cpu的话,loadavg是1(同一时间运行一个进程),就说明cpu利用率是100%。如果是双核cpu,loadavg为2(同一时间运行两个进程)说明cpu利用率是100%。htop左上角和nproc命令可以看系是几核cpu。
load数量包括了不可中断的进程数,但是处于这个状态的进程并不怎么影响cpu运行(可以认为不使用cpu时间)。所以从loadavg推断cpu使用率不太准,这也能解释一些为什么load很高,但是实际cpu使用率不高。
mpstat可以查看瞬时cpu使用情况,要安装sysstat(这是个牛逼的工具)。

[root@localhost ~]# yum install sysstat -y
[root@localhost ~]# mpstat 1
Linux 3.10.0-327.el7.x86_64 (localhost.virthost)  02/26/17  _x86_64_ (1 CPU)
17:38:41     CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
17:38:42     all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
17:38:43     all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
^C
Average:     all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

进程

htop默认显示用户进程和用户线程。

shift+H打开关闭用户线程
shift+K打开关闭内核线程
F5显示进程继承关系(类似ps -f)

/proc/<pid>/{pwd,exe,cmdline} 里包含了进程当前工作目录的链接,可执行程序的链接和命令行。可以通过读取procfs里的内容,从内核获取信息。
/proc/<pid>/status 包含当前进程的许多信息(内存分配情况,父进程id等),uid指明了当前进程所属用户:

[root@localhost htop]# cat /proc/47937/status | grep Uid
Uid: 0 0 0 0

id <uid>命令可以找到这个用户的相关信息。其实id也是读取/etc/passwd和/etc/group文件获取用户信息:

[root@localhost]# strace -e open id 0
...
open("/etc/nsswitch.conf", O_RDONLY|O_CLOEXEC) = 3
open("/lib64/libnss_files.so.2", O_RDONLY|O_CLOEXEC) = 3
open("/etc/passwd", O_RDONLY|O_CLOEXEC) = 3
open("/etc/group", O_RDONLY|O_CLOEXEC)  = 3
uid=0(root) gid=0(root) groups=0(root)
+++ exited with 0 +++

为什么会去找/etc/passwd 呢?这个是读取了/etc/nsswitch.conf 配置。

[root@localhost htop]# cat /etc/nsswitch.conf
...
passwd:     files sss
shadow:     files sss
group:      files sss
...

关于这个配置文件,可以参考这里:<http://www.cnblogs.com/cute/archive/2012/05/17/2506342.html>,总之就是/lib64/libnss_files.so 加载了这个文件,其他的一系列的name service和这个文件有关(比如dns),还可以配置成从ldap中获取用户名密码。
unix用户的密码保存在/etc/shadow:

[root@localhost]# cat /etc/shadow
root:$6$eS1H0Kk/$MPOOjZyuhc14tzBl.2O2VoLoXxkirzIdKKw41tP/cEjfEPe58VcQB3LLlGoJzuHRrE.WIjii9nalKWl/GJMoR/:17153:0:99999:7:::

第二列开头的$6$表示加密算法是sha512,后面紧接着是盐和盐+密码的hash。
用户运行可执行文件时,进程所属用户一般是当前用户自己,而不是可执行文件本身的属主(这点应该很好理解)。
使用sudo -u 运行程序可以切换进程属主。sudo权限在 /etc/sudoers配置,最好使用visudo编辑配置文件,它会对文件格式做验证。
/etc/passwd是非常敏感的文件,passwd在普通用户权限下运行,也能更改密码,说明passwd肯定是以root身份运行的,否则它没发修改passwd文件。当二进制程序有x权限后,可以设置setuid权限:

sudo chmod u+s /usr/bin/passwd
[root@localhost]# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 Jun 10  2014 /usr/bin/passwd

这样,二进制文件运行时,进程属主就是二进制文件的属主。
其他的特殊权限还有sticky bit和setgid。下面的命令可以找到权限类似passwd这样的命令:

[root@localhost]# find /usr/bin -user root -perm -u+s
/usr/bin/chage
/usr/bin/gpasswd
/usr/bin/newgrp
/usr/bin/chfn
/usr/bin/chsh
/usr/bin/su
/usr/bin/sudo
/usr/bin/mount
/usr/bin/umount
/usr/bin/staprun
/usr/bin/crontab
/usr/bin/pkexec
/usr/bin/passwd

进程状态

  • R 在运行队列里
  • S 可中断的休眠(等待事件发生)
  • D 不可中断的休眠,发生页面错误时,发生的IO不可以被中断,进程此时不能处理信号,处理信号可能会造成另外一个页面错误。如果有太多进程处于这个状态,意味着有可能大量进程发生页面错误,也许应该看下swap。
  • Z 僵尸状态,子进程退出后,相关的资源已经释放,父进程应该在收到SIGCHL信号后D收尸,不应该把子进程随便乱扔。
  • T 被任务控制信号停止,ctrl+z终止后台进程可以看到这种状态。
  • t 被debugger停止(调试),gdb -p <pid> attach的进程,可以看到这个状态。
  • X 应该永远看不见

F9 htop 发送信号快捷键

可以制造一个处于uninterruptible状态的进程。使用NFS挂在远程目录的时候,如果远程目录不存在,进程就会被挂起。我们使用google的DNS 8.8.8.8 试试,因为它没有打开NFS:

[root@localhost ~]# mount 8.8.8.8:/tmp /tmp &
[1] 48642
[root@localhost ~]# ps aux | grep mount
root      48642  0.0  0.0 125628   924 pts/1    S    22:03   0:00 mount 8.8.8.8:/tmp /tmp
root      48643  0.0  0.1  42468  1608 pts/1    D    22:03   0:00 /sbin/mount.nfs 8.8.8.8:/tmp /tmp -o rw
root      48645  0.0  0.0 112616   700 pts/1    R+   22:03   0:00 grep --color=auto mount

使用strace看看它到底在哪个调用上挂起了:

[root@localhost ~]# sudo strace /sbin/mount.nfs 8.8.8.8:/tmp /tmp -o rw
...
mount("8.8.8.8:/tmp", "/tmp", "nfs", 0, "vers=4,addr=8.8.8.8,clientaddr=1"...

进程运行的时间

linux的时间片大约在几毫秒(搞清楚linux上时间片到底多长也挺有意思的)。loadavg在单核机器上小于1,意味这cpu在过去一段时间什么事情都没做。

进程优先级

  • NI 用户空间优先级,最低-20到最高19。经验是升一级优先级通常可以获得10%的更多cpu时间。
  • PRI 内核空间优先级,0-139。0-99是实时优先级,100-139才是给用户进程用的,这映射到用户优先级的-20到19。

内存

编写用户空间的程序员或者程序,会感觉自己的程序拥有全部内存,这是幻觉。
用户态程序不会直接访问物理内存,只能访问虚拟内存空间,内核会把虚拟地址映射到物理内存或者磁盘上。
htop/top内存的含义:

  • VIRT/VSZ 虚拟内存,包括二进制的代码,数据,共享库,换出的页,映射了但是还没使用的页。
  • RES/RSS 进程实际在物理内存中的空间,不包括换出的内存,但是包括和其他进程共享的。
  • SHR 共享的内存
    htop/top内存使用率是指RES/RSS内存占总物理内存的百分比。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容

  • Ubuntu的发音 Ubuntu,源于非洲祖鲁人和科萨人的语言,发作 oo-boon-too 的音。了解发音是有意...
    萤火虫de梦阅读 99,223评论 9 467
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,154评论 2 33
  • 如果你想知道你的服务器正在做干什么,你就需要了解一些基本的命令,一旦你精通了这些命令,那你就是一个专业的 Linu...
    七寸知架构阅读 10,842评论 1 71
  • 进程相关概念系统进程管理工具任务计划 一、进程相关概念 定义:进程(Process)是运行中的程序的一个副本,是被...
    哈喽别样阅读 563评论 0 0
  • —直到和你做了多年朋友,才明白我的眼泪不是为你而流,也为别人而流。 人生若只如初见 胡静记得高一军训的那天晚上,那...
    若雨小姑娘阅读 523评论 13 17