Linux进程交换使用率大于整个系统交换使用率

我有一个奇怪的问题,当我运行top命令时,它显示有些进程使用了​​大约1.5GB的交换空间,但是系统交换的整体使用率却降低到117MB左右,为什么呢? 我认为整个系统交换使用情况是所有进程的总体使用情况,在这种情况下似乎并不正确。 这是输出:

Tasks: 392 total, 16 running, 373 sleeping, 0 stopped, 3 zombie Cpu0 : 95.1%us, 4.9%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu1 : 98.0%us, 2.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st Cpu2 : 91.1%us, 6.9%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 2.0%si, 0.0%st Cpu3 : 95.0%us, 3.0%sy, 0.0%ni, 0.0%id, 0.0%wa, 0.0%hi, 2.0%si, 0.0%st Mem: 4148160k total, 4007820k used, 140340k free, 15968k buffers Swap: 4096552k total, 117584k used, 3978968k free, 2909396k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ SWAP COMMAND 5784 apache 18 0 1567m 5772 4568 S 0.0 0.1 0:00.03 1.5g C:\windows\system32\explorer.exe /desktop 5776 apache 25 0 1558m 2564 2124 S 0.0 0.1 0:00.00 1.5g C:\windows\system32\winedevice.exe MountMgr 5774 apache 25 0 1558m 2324 1928 S 0.0 0.1 0:00.00 1.5g C:\windows\system32\services.exe 9395 apache 15 0 90536 2988 1340 S 0.0 0.1 0:00.00 85m /usr/sbin/httpd 9419 apache 18 0 90536 2988 1340 S 0.0 0.1 0:00.00 85m /usr/sbin/httpd 27016 apache 18 0 91520 4000 2964 S 0.0 0.1 0:00.04 85m /usr/sbin/httpd 7773 apache 16 0 91012 3592 1464 S 0.0 0.1 0:07.04 85m /usr/sbin/httpd 

顶部(至less在某些版本中)将每个进程的SWAP计算为VIRT – RSS,而不是报告真正的交换使用情况。 在Linux下,结果是一个完全没有意义的数字。

简短的回答

top的SWAP列是计算交换过程使用情况 (大致)以及此过程使用的任何映射文件和/或共享对象 。 映射文件不是交换的一部分,它们是由进程以某种方式读取的文件,而共享对象是进程之间共享的dynamic库(.so)或内存块。

所以如果两个进程共享一大块内存,那么每个进程都会被计数两次。 这块内存(如果有足够的可用内存,并且是活动的)可能不在交换中。 这块内存是为进程“保留”的,并不意味着它完全被使用,所以它不一定占用太多的物理内存。

手册页指出:“SWAP是通过从虚拟内存中减去物理内存来计算的”。 除非你是开发者(并且知道你在做什么),否则计算的值不应该依赖,对于临时用户来说,这没有实际意义,请参阅下面的原因。

长答案,什么是虚拟内存和映射文件?

注意:VIRT代表虚拟内存。

Linux进程虚拟内存

Linux中的每个进程(在许多Unix系统中也是如此)都被分配了一个虚拟地址空间。 在32位系统上,这个虚拟地址空间可达4GiB(2 ^ 32)。 在64位系统上。 这个虚拟地址空间高达256TiB(2 ^ 48是使用当前AMD64或Intel 64位扩展的64位系统只能寻址48位内存)。

每个进程虚拟内存都包含内核空间和用户空间区域。 在32位系统上,分割取决于PAE是否被激活,因此可以是3GiB / 1GiB或2GiB / 2GiB。 在64位上,总是(AFAIK)一半/一半,所以第一个47位(128TiB)用于用户空间,而在64位区域末尾,内核预留128TiB。

虚拟内存包括正在运行的进程的代码,数据和BSS,进一步包括堆栈和堆以及内存映射区域。 该区域包含任何共享内存(IPC,共享对象),也可以在内存中包含(AFAIK)映射文件。 看到我为64位系统制作的这个漂亮的graphics 。

一些关于映射文件的更多信息

可以映射大于可用内存的文件,因此VIRT大小可以大于内存。 内核足够聪明,可以将存储器中的数据加载/卸载到内存,以便像可用的物理空闲RAM允许的那样加速I / O。

你不应该关心VIRT大小的用户。 这主要是针对(硬核)开发者的。

总之 ,SWAP列计算虚拟内存减物理内存(可能比RSS更多),这可能包括使用的交换部分以及磁盘上的任何映射文件。