linux top 命令详解

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

top命令在procps中提供,procps的版本为3.3.10

top version

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

top command

每个选项含义

第一行:进程运行状态的汇总统计数据

第二行:CPU工作状态的分类统计信息

第三行:系统物理内存使用情况的汇总统计信息

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;
}

第四行:系统交换空间使用情况汇总统计