linux top 命令详解
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况。和服务器打交道的人应该经常用到。 可是要说清楚top命令中的每个选项的含义,对操作系统得有一定的了解才行,借此机会,对操作系统再复习一下。
top命令在procps中提供,procps的版本为3.3.10

在procps 3.3.10中top命令默认输出如下

每个选项含义
第一行:进程运行状态的汇总统计数据
- total 系统当前共有多少个进程
- running 正在运行或已处于运行队列,一旦调度即可运行的进程数量,这个数字可能会大于系统配置的cpu个数
- sleeping 因等待外部事件完成而处于休眠状态的进程数量
- stopd 因跟踪调试或暂停运行的进程数量
- zombie 僵尸进程的数量
第二行:CPU工作状态的分类统计信息
- %us CPU处于用户模式的时间量占用整个CPU时间的百分比
- %sy CPU处于系统模式的时间量占用整个CPU时间的百分比
- %ni CPU处于调整优先级的用户进程的时间量占用整个CPU时间的百分比
- %id CPU处于空闲状态的时间量占用整个CPU时间的百分比
- %wa CPU处于等待I/O完成的时间量占用整个CPU时间的百分比
- %hi CPU处理硬件中断的时间量占用整个CPU时间的百分比
- %si CPU处理软中断的时间量占用整个CPU时间的百分比
- %st Steal time,是当hypervisor服务另一个虚拟处理器的时候,虚拟CPU等待实际CPU的时间的百分比。
第三行:系统物理内存使用情况的汇总统计信息
- total 当前配置的可用物理内存总数
- free 当前仍然空闲的物理内存计数
- used 当前已经使用的物理内存计数
- buff/cache 当前块设备和普通文件占用的缓存页,网上看的说啥的都有,这个是经过读源码得出的 :w
top命令其实是读取/proc文件下的相关文件,内存信息是/proc/meminfo,meminfo文件是linux源码中/fs/proc/meminfo.c文件输出的 其中Buffer,Cache在meminfo_proc_show函数中,具体的分别由nr_blockdev_pages和cached = global_node_page_state(NR_FILE_PAGES) - total_swapcache_pages() - i.bufferram获得;
static int meminfo_proc_show(struct seq_file *m, void *v)
{
struct sysinfo i;
unsigned long committed;
long cached;
long available;
unsigned long pages[NR_LRU_LISTS];
int lru;
si_meminfo(&i);
si_swapinfo(&i);
committed = percpu_counter_read_positive(&vm_committed_as);
cached = global_node_page_state(NR_FILE_PAGES) -
total_swapcache_pages() - i.bufferram;
if (cached < 0)
cached = 0;
for (lru = LRU_BASE; lru < NR_LRU_LISTS; lru++)
pages[lru] = global_node_page_state(NR_LRU_BASE + lru);
available = si_mem_available();
...
show_val_kb(m, "Buffers: ", i.bufferram);
show_val_kb(m, "Cached: ", cached);
...
}
void si_meminfo(struct sysinfo *val)
{
val->totalram = totalram_pages;
val->sharedram = global_node_page_state(NR_SHMEM);
val->freeram = global_zone_page_state(NR_FREE_PAGES);
val->bufferram = nr_blockdev_pages();
val->totalhigh = totalhigh_pages;
val->freehigh = nr_free_highpages();
val->mem_unit = PAGE_SIZE;
}
long nr_blockdev_pages(void)
{
struct block_device *bdev;
long ret = 0;
spin_lock(&bdev_lock);
list_for_each_entry(bdev, &all_bdevs, bd_list) {
ret += bdev->bd_inode->i_mapping->nrpages;
}
spin_unlock(&bdev_lock);
return ret;
}
static inline unsigned long global_node_page_state(enum node_stat_item item)
{
long x = atomic_long_read(&vm_node_stat[item]);
#ifdef CONFIG_SMP
if (x < 0)
x = 0;
#endif
return x;
}
第四行:系统交换空间使用情况汇总统计