如何在VPS上配置虚拟内存(交换文件)

目录和前言

  1. 简介 - 要求和原因
  2. 优点&缺点 - Droplet
  3. 检查您的VPS上是否启用
  4. 交换分区,交换文件和磁盘映像
  5. 创建交换文件
  6. 启用和禁用交换
  7. 配置,优先级和sysctl设置
  8. 结论

前言

本文将介绍使用虚拟内存或交换文件(分页)的优缺点,确定您的Droplet是否已使用虚拟内存或分页,交换分区与交换文件之间的差异,如何创建交换文件的信息,以及如何配置系统的“swappiness”(使用虚拟内存的可能性以及确定要使用的适当大小)。

你可以阅读更多关于交换(分页)虚拟内存的维基百科。 它将回答很多在本文范围之外的问题。

维基百科上的分页(交换文件)文章的引文:(强调第二段的清楚解释)

“在计算机操作系统中,分页是计算机可以通过其存储和检索来自辅助存储器的数据以在主存储器中使用的存储器管理方案之一。在分页存储器管理方案中,操作系统从辅助存储器检索数据分页在内存分段的主要优点是它允许进程的物理地址空间是非连续的,在分页开始使用之前,系统必须将整个程序连续地存储在存储器中,各种存储和碎片问题“。

“分页是大多数当代通用操作系统中虚拟内存实现的重要组成部分,允许他们对不适合物理随机存取存储器(RAM)的数据使用磁盘存储。

注意

尽管交换通常被推荐用于使用传统旋转硬盘驱动器的系统,但是使用SSD交换可能导致硬件随时间的退化问题。 由于这一考虑,我们不建议在DigitalOcean或任何其他使用SSD存储的提供商上启用交换。 这样做会影响您和您的邻居的底层硬件的可靠性。

如果您需要提高服务器的性能,我们建议您升级您的Droplet。 这将导致一般更好的结果,并将降低可能影响您的服务的硬件问题的可能性。

简介 - 要求和原因

它是什么,为什么我会使用它?

无论你有一个512mbDroplet或8gbDroplet; Arch,Fedora,CentOS,Debian或Ubuntu; 应用程序或服务器/守护程序可能需要比您物理上更多的内存(或有时更多的内存分配)。 更具体地说,在我们的例子中,已分配给虚拟服务器以完成作业。

如果你正在处理任何生产服务器,你需要知道,如果虚拟内存没有启用,你的系统没有更多的可用内存...然后如果一个程序或服务 - 或许你的Web服务器 - 需要分配更多的内存,它会失败! 根据您的平台和配置,这可能导致许多不良或不稳定的情况,包括其他应用程序(即其他进程,而不是一个请求内存)被迫关闭释放所需的内存,失败和崩溃的程序 - 或整体服务器 - 完全。

正因为如此,我个人建议任何人,在几乎任何系统,无论是Droplet,专用服务器,您的Windows PC或Mac,甚至您的Android平板电脑或手机 - 应至少有一个小量的虚拟内存启用。

怎么运行的

虚拟内存允许您的系统(因此您的应用程序)额外的虚拟RAM超出了您的系统物理上有 - 或者在Droplet的情况下,分配的内容。 它通过使用您的磁盘为额外的,'虚拟'内存和交换数据进出系统内存和虚拟内存,因为它需要。

你应该知道,从磁盘读取/写入(甚至DigitalOcean的闪电快速SSD)至少比从实际系统RAM读取/写入慢几倍。 虽然虚拟内存会给你摆动的空间,允许更多的应用程序/服务器运行在一个Droplet和防止内存不足的错误,它不是一个替换解决方案,在实际上需要更多的内存/升级你的虚拟服务器的情况下。

虽然本文的内容对经验丰富的管理员来说可能看起来微不足道,但我认为这对于使用DigitalOcean主机服务的任何人都是有价值的信息,特别是那些对DigitalOcean,VPS系统,或管理自己的服务器。

要求

要求很简单,这种技术应该适用于所有分布和Droplet类型 - 事实上,它甚至可以在你的Android手机或平板电脑(如果你有root和busybox安装)。

  • 加电的Droplet或虚拟服务器(或专用服务器,基于linux的系统等)
  • 根终端访问(ssh,vnc,local)
  • 自由的命令,swapon命令使用swapoff,DD, 再用mkswap将被使用,而这些都应该提供您与您的Droplet使用任何平台上。

大多数平台自动使用和管理虚拟内存,并在安装过程中自动创建特殊的交换分区或系统分区上的文件,其大小通常基于可用系统RAM,或多个可用系统RAM。 1024mb交换为512MB RAM。

虚拟服务器并不总是这样,包括DigialOcean的Droplet。

优点&缺点 - Droplet

DigitalOcean的Droplet使用SSD(固态硬盘),它比常规硬盘驱动器快几倍,并且没有低寻道时间(由于硬盘驱动器的磁头必须物理地移动通过磁盘以读取数据)和每秒低IO请求。 SSD可以同时从多个区域读取,而硬盘驱动器通常只能一次从一个区域读取。

虽然它从来不是一个好主意 - 特别是对于web,邮件,db服务器 - 严重依赖虚拟内存,DO的SSD帮助使用虚拟内存不那么痛苦,更合乎逻辑。

优点

  • 防止OOM(内存不足)错误,崩溃,内存相关系统不可预测性/不稳定性。
  • 增加系统的可用内存,并允许更多程序同时并更安全地运行
  • DigtalOcean的SSD存储可减少VM相关的滞后和抖动,同时增加寻呼响应时间

缺点

  • 崩溃是一种可能性:当系统繁忙并且主动地使用比物理可用的更多的存储器时,VM系统被迫根据需要连续地将程序数据交换到磁盘以及从RAM输入和输出RAM。 我们可能都看到了这一结果在Windows PC稍微过载的硬盘似乎无尽地磨掉。 它是无法忍受的慢,没有乐趣。 然而,可以通过正确的配置来避免这种情况,这是一个在这里没有那么坏 - 再次是由于DigitalOcean的SSD的速度。
  • 使用磁盘空间,通常取决于系统内存。 如果你的Droplet有512mb,我建议使用512mb-1.5gb的交换; 然而这是您的Droplet的磁盘可用的更少的空间512mb-1.5gb。
  • 通常建议并优选使用专用磁盘分区进行交换; 但是这不可能在一个Droplet,我们必须使用交换文件/磁盘映像。

检查您的VPS上是否启用

完全可能您的配置已经使用虚拟内存。 下面的命令将告诉你如何确定它是否被启用,如果是,它的大小和配置。

打开终端或SSH / VNC到您的服务器 - 这些命令都在终端或shell中执行。

不要忘记,做出改变,你需要是根。 您可以检查您正在使用的命令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:/# _

您还可以缩小输出free | grep Swap free | grep Swap 这将只显示交换:线,总共使用和免费的虚拟机。 (记住,默认情况下,grep是区分大小写的!)

bash-root@my.droplet:/# free | grep Swap
Swap:       249896          0     249896
bash-root@my.droplet:/# _

交换分区,交换文件和磁盘映像

有关交换分区的注意事项

通常,对于基于Linux的系统,最好在硬盘上有一个专用的交换分区。 大多数系统将在正常安装期间自动执行此操作,如果您的交换已配置,则很可能是使用分区进行设置。 不幸的是,不是配置以下sysctl设置等,调整交换分区是本文的讨论范围之内。

但是,您仍然可以使用此处介绍的方法添加交换文件,并增加分区交换区之上和之外的可用虚拟内存。 但是,如果交换已经由系统配置和管理,则额外的虚拟内存可能不是必要的,并且可能更好的是保留默认设置,除非你知道你在做什么。

什么是交换文件?

而不是使用专用分区,一些系统(特别是Windows)会将其虚拟内存存储在特殊文件中。 当分区不可能或不可行时,这也是一个选项。 在Linux上,此文件实际上是一个磁盘映像。

什么是磁盘映像?

磁盘映像通常包括有关这些文件的文件和信息,以及包含它们的文件系统。

例子包括你的Droplet的快照(我喜欢称为雪花 - 冻结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。 所以,如果你有一个512mbDroplet,使用512mb-1gb交换。 如果你有一个1gb的Droplet使用1gb-2gb交换等。这不是一个硬和快速的规则,例如,如果你有一个4gb的Droplet,它可能是最好使用小(512mb)或根本没有交换。

这完全取决于您的使用,但这些说明是专为512mbDroplet。 我们将使用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设置

组态

一旦交换空间在线,就不需要配置太多。 你甚至可以在这里停止,如果你对nitty砂砾细节不感兴趣 - 一旦它通常启用它将适用于大多数设置。

优先级

如果要使用交换文件或跨多个设备和设备类型的分区(不太可能出现在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 --helpman 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. 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

请注意,一些文件中的描述指的是设置为“文件”,这是因为它们还可以通过Linux的的访问/配置SYSFS(维基百科)系统。

结论

感谢您阅读我的文章。 您现在应该了解分页/交换文件对于生产环境的稳定性以及在Droplet或虚拟机上下文中的重要性。

评论,修改,cookies谢谢! nom..nom..nom ..

参考文献和附录

使用引用,链接: Linux内核的虚拟机文件 (kernel.org) SYSFS系统 (维基百科) 交换(分页) (维基百科) 虚拟内存 (维基百科)

下面是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.

可能受版权保护或以其他方式保护的引用部分用于教学目的作为其合理使用资格。

:提交洁布德罗
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏