如何在VPS上配置虚拟内存(交换文件)
目录和前言
前言
本文将介绍使用虚拟内存或交换文件(分页)的优缺点,确定您的 Droplet 是否已经使用虚拟内存或分页,交换分区和交换文件之间的区别,有关如何创建交换文件的信息,以及如何配置系统的“swappiness”(使用虚拟内存的可能性以及确定要使用的适当大小)。
您可以在 Wikipedia 上阅读有关 Swap (Paging) 和 Virtual Memory 的更多信息。 它将回答本文范围之外的许多问题。
引用 Wikipedia 上的 Paging (swap file) 文章:(强调第二段以进行清晰的解释)
“在计算机操作系统中,分页是一种内存管理方案,计算机可以通过该方案从辅助存储器存储和检索数据以用于主存储器。 在分页内存管理方案中,操作系统从称为页面的相同大小的块中的辅助存储中检索数据。 与内存分段相比,分页的主要优点是它允许进程的物理地址空间是不连续的。 在分页开始使用之前,系统必须将整个程序连续地放入存储中,这会导致各种存储和碎片问题。”
“在大多数当代通用操作系统中,分页是虚拟内存实现的重要组成部分,允许它们将磁盘存储用于不适合物理随机存取存储器 (RAM) 的数据。”
笔记
尽管对于使用传统旋转硬盘的系统通常建议使用交换,但使用 SSD 交换可能会导致硬件随着时间的推移而退化。 出于这一考虑,我们不建议在 DigitalOcean 或任何其他使用 SSD 存储的提供商上启用交换。 这样做会影响您和您的邻居的底层硬件的可靠性。
如果您需要提高服务器的性能,我们建议升级您的 Droplet。 这通常会带来更好的结果,并且会降低导致可能影响服务的硬件问题的可能性。
简介 - 要求和原因
它是什么,我为什么要使用它?
无论您有 512mb 的液滴还是 8gb 的液滴; Arch、Fedora、CentOS、Debian 或 Ubuntu; 应用程序或服务器/守护程序可能需要比您实际拥有的更多内存(或有时分配更多内存)。 更具体地说,在我们的案例中,分配给虚拟服务器以完成工作的内容。
如果您正在处理任何生产服务器,您需要知道如果未启用虚拟内存并且您的系统没有更多可用内存......那么如果程序或服务 - 可能是您的 Web 服务器 - 需要分配更多内存,它会失败! 根据您的平台和配置,这可能会导致许多不良或不稳定的情况,包括其他应用程序(即 除了请求内存的进程之外的其他进程)被迫关闭以释放所需的内存,使其失败并完全崩溃程序 - 或整个服务器。
因此,我个人建议任何人,在几乎任何系统上——无论是 Droplet、专用服务器、Windows PC 或 Mac,甚至是 Android 平板电脑或手机——都应该至少启用少量虚拟内存。
这个怎么运作
虚拟内存允许您的系统(以及您的应用程序)超出您的系统物理拥有的额外虚拟 RAM - 或者在液滴的情况下,分配的内存。 它通过将您的磁盘用于额外的“虚拟”内存并根据需要在系统内存和虚拟内存中进出数据来实现这一点。
您应该知道从磁盘读取/写入(甚至是 DigitalOcean 的闪电般快速的 SSD)至少比从真实系统 RAM 读取/写入慢几倍。 虽然虚拟内存会给您提供回旋余地,允许更多应用程序/服务器在一个 droplet 上运行并防止内存不足错误,但在您实际需要更多内存/升级虚拟服务器的情况下,它不是替代解决方案。
虽然这篇文章的内容对于经验丰富的管理员来说可能看起来微不足道,但我认为它对于任何使用 DigitalOcean 托管服务的人来说都是有价值的信息,尤其是那些刚接触 DigitalOcean、一般 VPS 系统或管理自己的服务器的人。
要求
要求非常简单,这种技术应该适用于所有发行版和液滴类型 - 事实上,它甚至可以在你的 Android 手机或平板电脑上运行(如果你安装了 root 和 busybox)。
- 已开机的 Droplet 或虚拟服务器(或专用服务器、基于 linux 的系统等)
- 根终端访问(ssh、vnc、本地)
- 将使用命令 free, swapon, swapoff, dd, mkswap,这些都应该是可在您使用 Droplet 的任何平台上使用。
大多数平台会自动使用和管理虚拟内存,并会在安装过程中自动在系统分区上创建一个特殊的交换分区或一个文件,其大小通常基于可用系统 RAM 的倍数,或者是可用系统 RAM 的倍数,例如。 1024mb 交换为 512mb RAM。
虚拟服务器并非总是如此,包括 DigialOcean 的 droplets。
优点和缺点 - 液滴
DigitalOcean 的 Droplet 使用 SSD(固态磁盘),其速度比普通硬盘快几倍,并且不会遭受低寻道时间(由于硬盘驱动器的磁头必须在磁盘上物理移动以读取数据造成)和每秒低 IO 请求. SSD 可以同时从多个区域读取,而硬盘驱动器通常一次只能从一个区域读取。
虽然严重依赖虚拟内存从来都不是一个好主意 - 特别是对于 Web、邮件、数据库服务器 - 严重依赖虚拟内存,但 DO 的 SSD 有助于减少使用虚拟内存的痛苦和更合乎逻辑。
优点
- 防止 OOM(内存不足)错误、崩溃、与内存相关的系统不可预测/不稳定。
- 增加系统的可用内存并允许更多程序同时运行且更安全
- DigitalOcean 的 SSD 存储减少了与 VM 相关的延迟和抖动,同时增加了分页响应时间
缺点
- 抖动是一种可能性:当系统繁忙并且平均主动使用比物理可用的内存更多的内存时,VM 系统被迫根据需要不断地将程序数据“交换”到磁盘和从 RAM 中“交换”。 我们可能都在 Windows PC 中看到了这种结果,它略微过载,硬盘似乎无休止地磨掉了。 这是令人难以忍受的缓慢而且不好玩。 但是,可以通过正确的配置来避免这种情况,这是一个不那么糟糕的缺点——同样是由于 DigitalOcean 的 SSD 的速度。
- 使用磁盘空间,通常取决于系统内存。 如果你的 droplet 有 512mb,我建议使用 512mb-1.5gb 进行交换; 但是,您的 Droplet 磁盘上的可用空间减少了 512mb-1.5gb。
- 一般推荐并首选使用专用磁盘分区进行交换; 然而,这在 Droplet 中是不可能的,我们必须使用交换文件/磁盘映像来代替。
检查您的 VPS 是否已启用
您的配置完全有可能已经使用了虚拟内存。 下面的命令将向您展示如何确定它是否启用,如果启用,它的大小和配置。
打开终端或 SSH/VNC 到您的服务器 - 这些命令都在终端或 shell 中执行。
不要忘记,要进行更改,您需要成为 root。 您可以使用命令 whoami 查看您登录的用户。 如果它没有响应 root 或 0,您可以键入 su
来启动 root shell。
您可以通过在终端提示符处键入“free”命令来检查您的 Droplet 是否已启用虚拟内存:
bash-root@my.droplet:/# free
“free”命令显示系统可用的物理和虚拟内存。
如果您已经启用了虚拟内存,您可以跳到“关于交换分区的注意事项”,然后是配置部分。 启用后,输出将如下所示:
bash-root@my.droplet:/# free total used free shared buffers cached Mem: 361996 360392 1604 0 1988 54376 -/+ buffers/cache: 304028 57968 Swap: 249896 0 249896 bash-root@my.droplet:/# _
如果未启用,输出将如下所示:
bash-root@my.droplet:/# free total used free shared buffers cached Mem: 361996 360392 1604 0 2320 54444 -/+ buffers/cache: 303628 58368 Swap: 0 0 0 bash-root@my.droplet:/# _
<p>You can also narrow down the output with <code>free | grep Swap</code>. This will only show the <b>Swap:</b> line, total, used and free VM. (Remember, by default, grep is case sensitive!)</p>
bash-root@my.droplet:/# free | grep Swap Swap: 249896 0 249896 bash-root@my.droplet:/# _
交换分区、交换文件和磁盘映像
关于交换分区的说明
通常,对于基于 Linux 的系统,最好在硬盘上有一个专用的交换分区。 大多数系统会在正常安装期间自动执行此操作,如果您的交换已经配置,则很可能它是使用分区设置的。 不幸的是,除了配置以下 sysctl 设置之外,调整交换分区的大小超出了本文的范围。
但是,您仍然可以使用此处介绍的方法添加交换文件并在分区交换区域之外增加可用虚拟内存。 但是,如果系统已经配置和管理了交换,则可能不需要额外的虚拟内存,除非您知道自己在做什么,否则最好保留默认设置。
什么是交换文件?
一些系统(尤其是 Windows)不使用专用分区,而是将其虚拟内存存储在一个特殊文件中。 当分区不可能或不可行时,这也是一种选择。 在 Linux 上,这个文件实际上是一个磁盘映像。
什么是磁盘映像?
磁盘映像通常包括文件和有关这些文件的信息,以及包含它们的文件系统。
示例包括您的 droplet 的快照(我喜欢将其称为雪花 - 冻结的液滴),该功能可以创建整个 droplet 的磁盘映像以进行备份、复制、迁移等。
另一个主要的例子是大多数 Linux 发行版(或发行版)以磁盘映像的形式出现,通常采用 .iso 格式,这允许您将它们挂载或刻录到磁盘。
无论您以何种方式使用映像,要记住的重要一点是它们存储文件系统信息,因此它们可以像从中映像的文件系统一样使用 - 或完全重新创建它。
创建交换文件
在 droplet 的情况下,我们无法对存储进行分区,因此我们需要使用磁盘映像。 *NIX 操作系统使用专用文件系统进行交换,这就是我上面所说的首选使用分区的原因。 我们可以做的是创建一个大小根据所需虚拟内存大小的空磁盘映像,使用交换文件系统对其进行初始化,然后将其打开。
首先,你需要决定把这个文件放在哪里。 您需要在放置它的分区上有足够的可用空间,以便用于交换的任何 MB 数量,例如。 512mb 的交换空间创建了一个 ~512mb 的交换文件。
你可以使用命令 df -h 查看已安装的分区和文件系统,以及它们的大小和可用空间。
我建议将此文件放在 /var 中并将其命名为“swap.img”。 我们将 cd 到 /var 并创建此文件,然后将其权限设置为 600。
注意:为了安全起见,将文件权限设置为 600 非常重要,这样其他用户就不能直接读取文件,否则可能会读取系统内存或更糟。
bash-root@my.droplet:/# cd /var bash-root@my.droplet:/var# touch swap.img bash-root@my.droplet:/var# chmod 600 swap.img bash-root@my.droplet:/var# _
浆纱
现在我们将调整文件大小。 大小调整很重要,最佳大小将根据您的系统和用例而有所不同。
一般来说,我建议使用 1-2 倍的可用系统 RAM。 因此,如果您有 512mb 的 droplet,请使用 512mb-1gb 交换。 如果您有 1gb 的液滴,请使用 1gb-2gb 交换等。 这不是一个硬性规定,例如,如果您有一个 4gb 的 droplet,最好使用少量 (512mb) 或根本不使用交换。
这完全取决于您的使用,但这些说明是为 512mb 液滴量身定制的。 我们将使用命令 dd 用零或虚无填充我们的交换文件,以将其拉伸到我们需要的大小。 在这种情况下,我们使用 1gb 或 1024mb。 这可能需要一分钟。
bash-root@my.droplet:/var# dd if=/dev/zero of=/var/swap.img bs=1024k count=1000 1000+0 records in 1000+0 records out 1048576000 bytes (1.0 GB) copied, 4.0868896 s, 253 MB/s bash-root@my.droplet:/var# _
准备磁盘映像
在这里,我们将初始化交换文件系统。
bash-root@my.droplet:/var# mkswap /var/swap.img Setting up swapspace version 1, size = 1020 GiB no label, UUID=72761533-8xbe-436l-b07e-c0sabe9cedf3 bash-root@my.droplet:/var# _
一旦完成,它就可以使用了!
启用和禁用交换
启用您的交换文件
我们将使用 swapon 来启用它。 成功后将没有输出,但您可以使用 free
进行检查。
bash-root@my.droplet:/var# swapon /var/swap.img bash-root@my.droplet:/var# free total used free shared buffers cached Mem: 503596 478928 24668 0 38832 102384 -/+ buffers/cache: 337712 165884 Swap: 1048572 1780 1046792 bash-root@my.droplet:/var# _
您可以使用 swapoff /var/swap.img
将其关闭。
在引导期间启用您的交换文件
请注意 swapon 仅启用当前启动的文件; 如果您重新启动,它将不会重新联机,除非您将 swapon
编写为在启动时运行,或者更改您的 /etc/fstab
,这在大多数情况下要容易得多,并且是我们将在这里使用的方法。
您所要做的就是在您的 /etc/fstab
文件中添加一行,使其在启动时准备就绪。 当心! 如果格式不正确或被覆盖,此文件可能会破坏您的系统。 如果您将 swap.img 放在 /var 中,则可以毫无问题地复制/粘贴以下命令。 (如果您键入它,请确保有两个 > 符号,使用一个将覆盖文件而不是在末尾附加一行。
bash-root@my.droplet:/var# echo "/var/swap.img none swap sw 0 0" >> /etc/fstab bash-root@my.droplet:/var# _
配置、优先级和 sysctl 设置
配置
一旦您的交换空间在线,就不需要配置太多了。 如果您对细节不感兴趣,您甚至可以在这里停下来——一旦启用,它通常适用于大多数设置。
优先事项
如果您要使用跨多个设备和设备类型的交换文件或分区(不太可能在 droplet 上),您可能需要为这些交换区域中的每一个排序优先级,使用更快或更空闲的存储而不是更慢的存储和/或更繁忙的存储。 在大多数情况下,您可以将优先级指定为 swapon 或 /etc/fstab
的参数。
系统将在使用较低优先级的交换区域之前使用较高优先级的交换区域。 swaon -p
示例:
bash-root@my.droplet:/var# swapon -p 100 /var/swap.img bash-root@my.droplet:/var# swapon -p 10 /mnt/SecondDrive/swap.img
并且,对于 /etc/fstab
,可以使用 pri=
参数设置优先级,如下所示:
/var/swap.img none swap defaults,pri=100 0 0 /mnt/SecondDrive/swap.img none swap defaults,pri=10 0 0
sysctl 设置(和 sysfs)
我们将使用命令 sysctl 更改专用于 Linux 虚拟内存管理器的设置。
我只建议更改一个设置:vm.swappiness
。 此设置告诉 Linux 内核/VM 处理程序使用 VM 的可能性。 它是一个百分比值,介于 0 和 100 之间。
如果将此值设置为 0,VM 处理程序将最不可能使用任何可用的交换空间,并且应该首先使用所有可用的系统内存。 如果将其设置为 100,则 VM 处理程序将最有可能使用可用的交换空间,并会尝试将大部分系统内存留作可用空间。
我个人建议使用 30% 的值,这应该是交换内存和系统内存之间的一个愉快的媒介。 请注意,这个值更像是一个目标,而不是一个硬性规则。
以下是有关如何修改 sysctl 设置的示例。 有关详细信息,您可以键入 sysctl --help
或 man sysctl
。
bash-root@my.droplet:/var# sysctl -w vm.swappiness=30 vm.swappiness = 30 bash-root@my.droplet:/var# _
您还可以运行 sysctl -a
来列出所有 sysctl 选项(不仅仅是 VM)或 sysctl -a | grep vm.
。
或者,查看单个设置(您可以在 grep 命令后更改每个设置的键名):
bash-root@my.droplet:/var# sysctl -a | grep vm.swappiness vm.swappiness = 30 bash-root@my.droplet:/var# _
Linux VM (vm.*) 还有许多其他设置——尽管它们超出了本文的一般范围,我通常建议不要更改它们的设置。 但是,我在本文末尾(在附录中)包含了一个小选项列表,可能值得调整或学习,并且我为这些选项添加了我的推荐值(在括号中)。
Linux 内核网站有一个完整的选项列表和它们的使用,尽管不是每个内核都可以实现所有选项。 在撰写本文时,该文档已经略微过时,但绝不是无用或贬低。 这里'是链接:https://www.kernel.org/doc/Documentation/sysctl/vm.txt。
请注意,该文档中的某些描述将设置称为 'files',这是因为它们也可以通过 Linux's SysFS (Wikipedia) 系统访问/配置。
结论
感谢您阅读我的文章。 您现在应该了解分页/交换文件对生产环境以及在 Droplet 或虚拟机上下文中的稳定性的重要性。
感谢评论、更正、cookies! 名义..名义..名义..
参考文献和附录
参考文献,链接: Linux 内核虚拟机文档 (kernel.org) SysFS系统 (Wikipedia) 交换(分页) (Wikipedia) 虚拟内存 (Wikipedia)
下面是 sysctl/sysfs vm 相关选项的列表,可能值得调整或学习,以及我对某些设置的建议值。 这些描述是故意简短的 - 请参阅 kernel.org 参考链接以获取完整的详细信息。
dirty_background_bytes** Contains the amount of dirty memory at which the background kernel flusher threads will start writeback. Note: dirty_background_bytes is the counterpart of dirty_background_ratio. Only one of them may be specified at a time. When one sysctl is written it is immediately taken into account to evaluate the dirty memory limits and the other appears as 0 when read. dirty_background_ratio** Contains, as a percentage of total system memory, the number of pages at which the background kernel flusher threads will start writing out dirty data. Note: dirty_background_ratio is the counterpart of dirty_background_bytes. Only one of them may be specified at a time. See above. dirty_bytes** Contains the amount of dirty memory at which a process generating disk writes will itself start writeback. Note: dirty_bytes is the counterpart of dirty_ratio. Only one of them may be specified at a time. When one sysctl is written it is immediately taken into account to evaluate the dirty memory limits and the other appears as 0 when read. dirty_expire_centisecs** This tunable is used to define when dirty data is old enough to be eligible for writeout by the kernel flusher threads. It is expressed in 100'ths of a second. Data which has been dirty in-memory for longer than this interval will be written out next time a flusher thread wakes up. dirty_ratio** Contains, as a percentage of total system memory, the number of pages at which a process which is generating disk writes will itself start writing out dirty data. Note: dirty_bytes is the counterpart of dirty_ratio. Only one of them may be specified at a time. See above. dirty_writeback_centisecs** The kernel flusher threads will periodically wake up and write `old' data out to disk. This tunable expresses the interval between those wakeups, in 100'ths of a second. Setting this to zero disables periodic writeback altogether. drop_caches** Writing to this will cause the kernel to drop clean caches, dentries and inodes from memory, causing that memory to become free. laptop_mode** (0 or Off for servers) laptop_mode is a knob that controls "laptop mode". All the things that are controlled by this knob are discussed in Documentation/laptops/laptop-mode.txt. memory_failure_recovery** (1 or On if supported) Enable memory failure recovery (when supported by the platform) 1: Attempt recovery. 0: Always panic on a memory failure. min_free_kbytes** (2048kb to 4096kb) This is used to force the Linux VM to keep a minimum number of kilobytes free. The VM uses this number to compute a watermark[WMARK_MIN] value for each lowmem zone in the system. Each lowmem zone gets a number of reserved free pages based proportionally on its size. Some minimal amount of memory is needed to satisfy PF_MEMALLOC allocations; if you set this to lower than 1024KB, your system will become subtly broken, and prone to deadlock under high loads. Setting this too high will OOM your machine instantly. oom_dump_tasks** Enables a system-wide task dump (excluding kernel threads) to be produced when the kernel performs an OOM-killing and includes such information as pid, uid, tgid, vm size, rss, nr_ptes, swapents, oom_score_adj score, and name. This is helpful to determine why the OOM killer was invoked, to identify the rogue task that caused it, and to determine why the OOM killer chose the task it did to kill. oom_kill_allocating_task** This enables or disables killing the OOM-triggering task in out-of-memory situations. overcommit_memory** This value contains a flag that enables memory overcommitment. overcommit_ratio** When overcommit_memory is set to 2, the committed address space is not permitted to exceed swap plus this percentage of physical RAM. See above. page-cluster** page-cluster controls the number of pages up to which consecutive pages are read in from swap in a single attempt. This is the swap counterpart to page cache readahead. panic_on_oom** (0 or Off/disabled) This enables or disables panic on out-of-memory feature. swappiness** (30 to 50) This control is used to define how aggressive the kernel will swap memory pages. Higher values will increase agressiveness, lower values decrease the amount of swap. vfs_cache_pressure** Controls the tendency of the kernel to reclaim the memory which is used for caching of directory and inode objects.
可能受版权保护或以其他方式保护的引用部分作为其合理使用资格用于教学目的。