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 应由进程使用,另一半应由缓存使用。在这里,您刚刚恢复,因此您的缓存几乎是空的,很快就会填满。