top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。
这里,我对top命令中所展示的信息做一个简要梳理。
我们可以把top信息分为两个部分,第一部分是系统信息,第二部分是进程信息。
在上半部分,显示的系统信息。
top - 18:13:21 up 10 days, 21:24, 2 users, load average: 0.00, 0.01, 0.05
18:13:21
指的是系统当前时间,up 10 days, 21:24
指的是系统从启动到现在经历过的时间。
2 users
指的是当前登录的用户数。
load average: 0.00, 0.01, 0.05
指的是当前系统的负载情况。其中三个数值分别代表系统1分钟、5分钟、15分钟的CPU负载信息。
注:上边的信息也可以通过
uptime
命令来拿到。
通过who
命令也可获取到当前登录的用户信息。
pts
表示使用SSH远程登录而来,第三列表示登录时间,第四列表示是从哪个IP登录而来。
通过w
命令可以获取登录用户的更多信息
最后一列是该用户执行的信息,什么都没做显示的是-bash
。
使用history
命令获取当前用户的操作历史,查看~/.bash_history
也可以获取同样的记录。
以单核CPU为例,单核CPU的load满载为1,表示每个处理时刻的cpu都有任务要处理。load可以大于1,大于1说明有任务没有被IO阻塞,而是受限于CPU性能。
Linux命令中获取的系统负载,实际上都取自/proc/loadavg
。在/proc/目录中,mount的是一种叫proc的Linux伪文件系统,主要被用作获取内核数据结构的接口。
要了解/proc/loadavg
逻辑,可以直接查看对应的内核代码Linux v5.5 fs/proc/loadavg.c
static int loadavg_proc_show(struct seq_file *m, void *v)
{
unsigned long avnrun[3];
get_avenrun(avnrun, FIXED_1/200, 0);
seq_printf(m, "%lu.%02lu %lu.%02lu %lu.%02lu %ld/%d %d\n",
LOAD_INT(avnrun[0]), LOAD_FRAC(avnrun[0]),
LOAD_INT(avnrun[1]), LOAD_FRAC(avnrun[1]),
LOAD_INT(avnrun[2]), LOAD_FRAC(avnrun[2]),
nr_running(), nr_threads,
idr_get_cursor(&task_active_pid_ns(current)->idr) - 1);
return 0;
}
avenrun数组中的高21位存放的是整数,低11位存放的是小数,avenrun数组是由操作系统每5s刷新产生。他的计算公式比较复杂,但整体上是和操作系统中运行中任务数(TASK_RUNNING)
和不可中断的睡眠任务数(TASK_UNINTERRUPTIBLE)
正相关。
一般情况下,单核CPU的load应该在1以下。0.7-1之间是比较合适的区间。当load=1时,说明系统已经没有额外的资源处理任务。当load>5,说明系统已经不堪重负。
通常情况下,我们最关心的还是load15,如果load15过高,说明系统处于高位很久了。之后再看看load5和load1,如果已经恢复到正常水平,那么就不要紧。
Tasks: 241 total, 1 running, 240 sleeping, 0 stopped, 0 zombie
在第二行,显示的是操作系统当前的任务总数、正在运行的任务数、处于睡眠状态的任务数、停止的任务数、僵死的任务数。
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
在第三行,显示的是cpu的一些信息。
要理解CPU信息,就需要先了解Kernel space和User space。简单来说,Kernel space 是 Linux 内核的运行空间,User space 是用户程序的运行空间。为了安全,它们是隔离的,即使用户的程序崩溃了,内核也不受影响。Kernel space 可以执行任意命令,调用系统的一切资源;User space 只能执行简单的运算,不能直接调用系统资源,必须通过系统接口(又称 system call),才能向内核发出指令。再简单来说,就是各类加减乘除都是在用户空间进行的,而读写文件、网络IO都是需要切换到内核空间执行。
例如:在cp文件时,需要先将文件拷贝到内核空间的buffer上,再拷贝到用户空间的buffer上,之后再反过来,从用户空间buffer拷贝到内核空间buffer,最终再写到磁盘上。
上面这个例子中,等待打开文件属于wa,读取文件内容到内核空间buffer再同步到用户空间buffer属于sy,用户空间buffer之间转移属于us。
top默认显示的数据是所有cpu的平均值,如果想看每一个cpu的处理情况,按1即可,再按1返回;
KiB Mem : 2027952 total, 109736 free, 1137384 used, 780832 buff/cache
KiB Swap: 4194300 total, 4176124 free, 18176 used. 641044 avail Mem
内存信息的单位是KiB
交换空间的单位也是KiB
先来看看内存空间,total=used+free。但buff和cache是什么意思?
在Linux中,操作系统会把读取过的数据都缓存起来,以便下次读取时减少读取时间。即使程序运行结束,内存也不会自动释放。而buff和cache就是linux的缓存内存,这部分缓存内存会在其他程序需要更多内存,但free内存不够时被释放。
所以程序真实使用的内存数应该是real-used = used-buff-cache。上面的例子真实使用内存应该是340MB+。
我们也可以使用free -m
来查看内存情况。
buff和cache的用途不同。buff是用来处理两个系统间速度不均衡的缓存,例如网卡的数据会存满一个buffer后,再由系统处理。cache是从硬盘读取文件到内存的缓存,例如使用vim编辑一个文件,这个文件就会被加载到内存。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1491 mysql 20 0 2686220 116436 6264 S 0.3 5.7 12:14.69 mysqld
72189 root 20 0 0 0 0 S 0.3 0.0 0:12.23 kworker/0:0
1 root 20 0 191164 3296 2052 S 0.0 0.2 0:13.91 systemd
我们来分别看看每列的含义
nice -n -20 xxx
renice -20 -p pid
查看全部进程信息,包含进程所有者、PID、PPID、启动以来耗费CPU时间、CMD等
ps -ef