当从休眠状态唤醒时,top命令的VIRT列会显示进程使用的交换空间吗?

当从休眠状态唤醒时,top命令的VIRT列会显示进程使用的交换空间吗?
top - 10:43:31 up 8 days,  1:28,  4 users,  load average: 0.72, 0.57, 0.44
Tasks: 180 total,   1 running, 177 sleeping,   0 stopped,   2 zombie
%Cpu(s):  8.9 us,  2.1 sy,  0.0 ni, 88.9 id,  0.0 wa,  0.0 hi,  0.2 si,  0.0 st
KiB Mem:   8078124 total,  3815444 used,  4262680 free,   108300 buffers
KiB Swap:  9437180 total,  2448032 used,  6989148 free,   446248 cached

PID  USER      PR  NI  VIRT SWAP  RES CODE DATA  SHR S  %CPU %MEM    TIME+  COMMAND                      
3274 root      20   0  160m 4392 6808 2400  80m 1684 S  13.2  0.1 245:09.29 wicd                         
3451 root      20   0 79684 4900 2328 2400 6124  764 S   7.9  0.0 150:21.43 wicd-monitor                 
2804 messageb  20   0 30200  232  856  392  756  408 S   6.6  0.0 128:20.46 dbus-daemon                  
3856 cifer     20   0  411m 7524  28m 2400 150m 5904 S   1.3  0.4  20:34.23 wicd-client                  
4226 cifer     20   0 1499m 197m  52m  86m 1.0g 6504 S   1.3  0.7 227:24.62 chromium   
1087 cifer     20   0 1556m 458m 166m  86m 1.2g 9980 D   2.3  2.1   4:27.35 chromium 

正如你所看到的,我有8G物理内存,只使用了3.8G,我确信我从未超过8G空间,所以,我认为使用2.4G交换空间只是因为休眠

现在,在top命令中,VIRT和SWAP列显示每个进程都使用了交换空间,我已经添加了所有进程的SWAP列,看起来比2.4G小一点。

我对吗?交换使用是否是由于休眠引起的?

我还有一个问题,两个chromium进程的VIRT DATA列看起来这么高,这可能吗?

答案1

看一下top的手册页:

o: VIRT  --  Virtual Image (kb)
   The  total amount of virtual memory used by the task.  It includes all code, 
   data and shared libraries plus pages that have been swapped out. (Note: you 
   can define the STATSIZE=1 environment variable and the VIRT will be 
   calculated  from the /proc/#/state VmSize field.)

   VIRT = SWAP + RES.

p: SWAP  --  Swapped size (kb)
   The swapped out portion of a task's total virtual memory image.

另外,这里有一条来自 ArchLinux Wiki 的评论,标题为:挂起和休眠

摘抄

  • 挂起至 RAM 方法会切断除 RAM 之外的机器大部分部件的电源,这是恢复机器状态所必需的。由于可以节省大量电量,因此建议笔记本电脑在计算机使用电池运行且盖子关闭(或用户一段时间不活动)时自动进入此模式。
  • 挂起到磁盘方法将机器的状态保存到交换空间中并完全关闭机器电源。当机器上电后,状态恢复。在此之前,功耗为零。

根据这些评论,我认为您的逻辑是正确的。我通常从不使用休眠模式,而只选择使用挂起到 RAM 方法,因此我从未见过交换使用量激增,考虑到上述情况,这是有道理的。

例子

$ top
top - 23:40:12 up 15:33,  5 users,  load average: 2.49, 2.62, 2.70
Tasks: 307 total,   3 running, 304 sleeping,   0 stopped,   0 zombie
Cpu(s): 47.6%us,  4.6%sy,  0.0%ni, 47.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   7987492k total,  7528920k used,   458572k free,   161664k buffers
Swap:  5963772k total,    40156k used,  5923616k free,  1100816k cached

答案2

我不这么认为。除了使用交换空间作为存储数据的区域之外,休眠与交换无关 - 您甚至可以禁用交换(卸载所有交换分区/文件)并仅在系统进入休眠状态时再次安装(有一个小窗口)当然是为了竞争条件)。

也就是说,我认为更有可能的是,在休眠之前的某个时刻,内核决定交换当前未运行的程序的某些代码页(或其中未运行的部分)在性能方面更有意义。最近没有使用过)以使一些内存可用于数据(无论是通过 分配内存malloc()memmap()还是只是文件系统的缓存)。这取决于您的使用模式,并且可以通过调整交换的趋势来控制/proc/sys/vm/swappiness

答案3

VIRT是进程分配的虚拟内存的大小。这包括进程映射的所有内容:RAM 中的页面、交换中的页面、与其他进程共享的页面、内存映射文件以及其他一些类型。

休眠的工作原理是将所有进程数据写入交换空间。根据休眠机制(Linux 经历过一些),当您恢复时,部分或大部分数据可能会保留在交换区中。页面仅在需要时才加载,这使得恢复速度更快。

请注意,即使您的进程没有使用整个 RAM,交换也可能发生。 RAM 不仅用于进程内存,还用于磁盘高速缓存和缓冲区。在可用 RAM 量相当接近工作负载所需量的典型系统上,任何时候大约一半 RAM 应由进程使用,另一半应由缓存使用。在这里,您刚刚恢复,因此您的缓存几乎是空的,很快就会填满。

相关内容