我遇到了一个奇怪的问题,当我跑步时顶部命令显示一些进程正在使用大约 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
答案1
Top(至少在某些版本中)将每个进程的 SWAP 计算为 VIRT - RSS,而不是报告实际交换使用情况。在 Linux 下,结果是一个完全没有意义的数值。
答案2
简短回答
SWAP 列top
是(粗略地)计算交换进程使用情况以及此进程使用的任何映射文件和/或共享对象。映射文件不属于交换,它们是进程以一定的方式读取的文件,而共享对象是进程之间共享的动态库(.so)或内存块。
因此,如果两个进程共享一大块内存,则top
每个进程都会计算两次。这块内存(如果有足够的可用内存并且处于活动状态)可能不在交换区中。这块内存是为进程“保留”的,但这并不意味着它已被完全使用,因此它不一定占用太多物理 RAM。
手册页指出:“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 位上,它始终是(据我所知)一半一半,因此前 47 位(128TiB)用于用户空间,在 64 位区域的末尾,有 128TiB 保留给内核。
虚拟内存包括正在运行的进程的代码、数据和BSS,还包括堆栈和堆,和内存映射区域。此区域包含任何共享内存(IPC、共享对象),并且还可以包含(据我所知)内存中的映射文件。请参阅此我为 64 位系统制作了精美的图形。
有关映射文件的更多信息
可以映射大于可用内存的文件,因此 VIRT 大小可以大于内存。内核足够聪明,可以将数据从存储加载/卸载到内存,以在可用物理空闲 RAM 允许的范围内尽可能地加速 i/o。
作为用户,您不必关心 VIRT 的大小。这主要针对(硬核)开发人员。
综上所述,SWAP 列计算虚拟内存减去物理内存(可能比 RSS 还多),这可能包括使用的交换部分和磁盘上的任何映射文件。