简短回答

简短回答

我遇到了一个奇怪的问题,当我跑步时顶部命令显示一些进程正在使用大约 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 还多),这可能包括使用的交换部分和磁盘上的任何映射文件。

相关内容