root@host [/home4/nudenude/public_html/hello/cache]# top -r
top: unknown argument 'r'
usage: top -hv | -abcHimMsS -d delay -n iterations [-u user | -U user] -p pid [,pid ...]
root@host [/home4/nudenude/public_html/hello/cache]# top
top - 09:15:22 up 32 days, 7:12, 2 users, load average: 274.18, 268.12, 262.50
Tasks: 863 total, 215 running, 630 sleeping, 3 stopped, 15 zombie
Cpu(s): 13.8%us, 85.7%sy, 0.4%ni, 0.0%id, 0.0%wa, 0.0%hi, 0.2%si, 0.0%st
Mem: 16313868k total, 7121660k used, 9192208k free, 679320k buffers
Swap: 4194296k total, 311896k used, 3882400k free, 478132k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
6051 nudenude 20 0 103m 29m 4892 R 4.2 0.2 0:14.04 php
6472 nudenude 20 0 97048 26m 5272 R 4.2 0.2 0:13.07 php
7181 nudenude 20 0 100m 30m 4928 R 4.2 0.2 0:11.31 php
7196 nudenude 20 0 105m 26m 5264 R 4.2 0.2 0:11.19 php
8003 nudenude 20 0 105m 32m 5288 R 4.2 0.2 0:09.42 php
8008 nudenude 20 0 107m 29m 4960 R 4.2 0.2 0:09.42 php
8050 nudenude 20 0 105m 34m 5276 R 4.2 0.2 0:09.32 php
8052 nudenude 20 0 98664 23m 5300 R 4.2 0.1 0:09.32 php
8067 nudenude 20 0 104m 28m 5296 R 4.2 0.2 0:09.31 php
8257 nudenude 20 0 96608 25m 5304 R 4.2 0.2 0:09.02 php
10640 nudenude 20 0 96032 22m 4932 R 4.2 0.1 0:04.40 php
12082 investgr 20 0 87588 16m 4928 R 4.2 0.1 0:00.23 php
5962 nudenude 20 0 103m 33m 4900 R 3.9 0.2 0:14.19 php
6095 nudenude 20 0 105m 29m 5276 R 3.9 0.2 0:13.96 php
6467 nudenude 20 0 103m 28m 5280 R 3.9 0.2 0:12.97 php
6488 nudenude 20 0 102m 26m 5280 R 3.9 0.2 0:12.96 php
Run Code Online (Sandbox Code Playgroud)
我的服务器有 16 GB 内存。其中7GB仍然是免费的。而服务器使用的是 4GB SWAP 内存,85.7% 的内存被系统使用。
为什么?还要看列。VIRT 103m,RES 29m。所以大多数内存甚至不是物理的。为什么?
“VIRT 103m,RES 29m。所以大多数内存甚至不是物理内存。为什么?”
由于让您注意到这种差异是我的错,因此我将尝试进一步解释。
如果你做过一些编程,你可能知道什么是内存地址——它(通常)是一个 32 或 64 位的数字(因此,32 和 64 位计算机)系统用来组织内存字节;内存的每个字节都有一个地址。如果您不熟悉这一点,那么这就是您现在需要知道的全部内容。
您在现代操作系统上编程时遇到的地址并不是“真实”的,因为它是唯一的,指的是 RAM 中特定的唯一位置。换句话说,一个程序中的地址0xdeadbeef(即 32 位十六进制数,通常是地址的表示方式)与其他程序中的 0xdeadbeef 不同。曾几何时,他们是;换句话说,系统只有一组地址,从 0x000000 开始,这个地址空间在所有东西之间共享,包括内核。
情况不再如此的原因有很多,其中之一是安全性。假设不同的程序不能访问彼此的内存,因此它们没有理由需要地址。无论如何,现在发生的事情是内核为每个进程提供了一个从 0x0000000 开始的虚拟地址空间(另请参阅我对其他答案的回答)。这是这样组织的,以便它的一部分映射到其他实体,例如共享库等。进程自己的私有空间被分成不同的部分,其中大部分是纯理论的——它在技术上是“堆”部分的一部分,但是程序很少使用它们可用的整个堆。
顶部的 VIRT 分数取自内核通过 /proc 接口报告的数字。它是所有部分中的所有地址实际上已致力于特定的东西。换句话说,它是实际使用的程序可用虚拟地址空间的数量。
这仍然与真实记忆不同。 说您可能以特定方式使用某物与使用它不同。例如,如果我声明了一个 100 MB 的数组但在数组中什么都不放,我只是在我的 VIRT 分数中添加了 100MB,但没有(或几乎没有,您需要一个字节来保存数组的地址)到 RSS/ RES(“驻留集大小”)得分。内核以这种方式进行内存管理非常聪明。维护一张将虚拟地址映射到真实地址的表意味着虚拟地址列表可以比相应的真实地址列表大得多,因为很多虚拟地址不对应任何东西 因为程序实际上并没有尝试访问它们——它只是要求创建它们。
当程序要访问尚未映射的地址时,内核会提供一些实际内存来执行此操作。因此,消耗的“虚拟地址空间”量将始终大于使用中的“实内存”量。通常它要大得多,但具体原因超出了本解释的范围;)
您也许可以将 VIRT 视为您安排的信用额度,将 RES 视为您的实际债务。由于 RES 包括可能与其他程序(通常是公共库)共享的部分,这个类比变得复杂;这些部分是真实的,但它们的分数在访问它们的所有进程中都是重复的。linux 内核报告“Pss”分数,例如:
当使用 A 的其他进程之一结束时,您的 Pss 将相应上升(至 33%)。然而,Top 没有报告这个数字。
为什么当仍有大量未使用的物理内存时 linux 使用交换内存
它与两个优先事项有关,这两个优先事项非常重视留出一些物理内存。在这种情况下,当东西被换出时,它属于仍在加载但已经空闲很长时间的进程。如果/当它们再次使用时,它们将从交换加载回物理内存(如有必要,交换其他内容)。
想要保留空闲内存池的第一个原因与上面讨论的内容有关;虽然银行(内核)发布的信用额度 WRT 内存可能比一次性完成的要多,但它很有可能不必这样做。但是,它可能必须在不久的将来完成其中的一部分。因此,我们的想法是,通过保持手头的大量更改,可以使活动流程更具响应性;如果长时间的空闲进程留在 RAM 中直到它完全充满,交换将变得更加明显并减慢最活跃的进程,因为它直到关键点才会发生。
另一个原因是空闲RAM实际上被内核用作文件缓存(这就是为什么第一行free输出通常与第二行非常不同的原因)。文件缓存的目的是将经常使用但现在没有实际使用的内容保存在内存中,以防在不久的将来再次需要它们。当一个正在运行的进程完成某事时,它被标记为空闲内存,但作为文件缓存的一部分留在那里。如果那个或另一个进程再次请求那个东西,它只是被标记为那个进程的一部分(不再空闲),这意味着它不必再次从磁盘加载。这也为活动进程提供了响应能力和更高的性能。
您可以通过调整/proc/sys/vm/swappiness分数来调整内核对执行此策略的渴望程度。但是,除非您有特定的理由这样做,否则您应该保持原样——在确定如何在各种情况下保持系统最快速响应方面已经进行了大量的思考和经验。