为了如何将我的网络服务器数据移动到 (tmpfs) RAM 磁盘上? (实验),我提出了一些想法、笔记和相关内容。需要听听我的整个想法是否合理可靠,以及这样的实验是可行的。
tmpfs
在启动时自动创建足够大的 ( ) RAM 磁盘。使用相同的脚本,复制 www 数据,调整所有权,几乎一切。
日志将保留在我的 PCIe 3.0 x4 类型的 NVMe SSD 上:
# nvme list Node SN Model Namespace Usage Format FW Rev --------------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- -------- /dev/nvme0n1 < SN REDACTED > Samsung SSD 970 EVO Plus 2TB 1 360.10 GB / 2.00 TB 512 B + 0 B 2B2QEXM7
该笔记本电脑有 32 GB RAM(DDR4 2400 MHz,双通道),我觉得它没有被使用。
笔记本电脑的电池可以使用几分钟,但仍然可以使用。
笔记本电脑已插入较旧的 UPS,我可能需要更换电池(请注意)。
我的上行链路速度(几乎)为 100 Mbits/s。https://www.speedtest.net/result/16116969035
我很少重新启动这台笔记本电脑,它基于第七代 Intel,并具有 AES-NI 指令集。
我大约每周使用 Timeshift-GTK 应用程序制作一次快照。每月对两个 SSD 进行完整克隆。
操作系统是基于 Ubuntu 22.04 的 Linux Mint 21.3 Cinnamon 64 位。当前内核版本为 6.5.0-27。
这就是我对这个实验的笔记,如果你问我的话,这是一个有趣的笔记。
我相信对我来说唯一困难的部分是编写 shell 脚本来实现自动化。同时这也可能很有趣。不知道从哪里开始以及不要忘记什么。感谢所有和任何提示。
答案1
这样的实验是可行的。
是的,这听起来微不足道。解决您提到的需要做的事情:
在启动时自动创建足够大的 (tmpfs) RAM 磁盘。
这可以作为 /etc/fstab 中的条目来完成,例如,
tmpfs /var/www/ramdisk tmpfs noauto,size=4g
设置一个 4GB(最大,不知道为什么你要指定它,但你要求它)ramdisk。 Tmpfs 始终只使用存储文件所需的 RAM,并且您有一个定义的大小。无论如何,你的选择!
noauto
是可选的,但由于我们只需要 ramdisk 来启动 Web 服务器,因此我们可以等待设置 ram 磁盘,直到那时 - 明智的 init 系统将了解挂载和启动单元之间的依赖关系(如果被告知的话),并启动“最方便下单”。换句话说,我们不要通过设置仅在后期启动时需要的 RAM 磁盘来使早期启动陷入困境。
使用相同的脚本,复制 www 数据,调整所有权,几乎一切。
当然,您可以在启动时执行一个脚本来执行此操作;没必要搞得太复杂,acp -ar /var/www/disk/* /var/www/ramdisk/
就可以了。 (假设您在源中设置了正确的权限)。或者,您可以将 tar 或 squashfs 存档解压到您的目标中。 Linux 上的许多东西都保留了所有权和权限!
您希望“复制数据脚本”成为引导系统的一部分,以便它始终在 Web 服务器启动之前运行。在 systemd 中,这特别容易,您需要在 /etc/systemd/system/ 中放置一个“setup-ramdisk.service”文件,并在其中放入类似的内容,
[Unit]
Description=Set up contents of RAM disk
[Service]
Type=oneshot
# We're going for the "extract from compressed archive" approach here,
# going for `cp -ar` would be just as valid
ExecStart=unsquashfs -d /var/www/ramdisk /var/www/disk/archive.squash
# Tell the system we need that ramdisk mount
RequiresMountsFor=/var/www/ramdisk
# Make sure that if started at the same time as a web server,
# we need to be done before the web server is started
Before=nginx.service httpd.service apache2.service
[Install]
WantedBy=multi-user.target
所以,这相当容易;systemctl enable --now setup-ramdisk
启用它(用于将来的启动)并立即运行它。您还可以修改 Web 服务器的 .service 文件(可能在 /usr/lib/systemd/system/ 中)以列出Wants=setup-ramdisk.service
和After=setup-ramdisk.service
然而,
想法是合理且可靠的
不,有两个原因:
我的上行链路速度(几乎)为 100 Mbits/s。
可爱的。您的 SSD 比这快得多,随机访问时间应该低于 TCP 连接建立中的抖动,并且您有足够的 RAM 来缓存 SSD 访问:即使在第一的请求文件时,请求该文件的一方将无法注意到从 RAM 磁盘读取或直接从 SSD 读取之间的区别,并且只要您不将 RAM 用于其他用途,该文件就会保留无论如何,缓存在 Linux 的 RAM 缓冲区中。你的 RAM 磁盘除了让 RAM 被你所需要的数据占用之外,什么也做不了。甚至可能不需要。
所以,我没有看到任何感觉在这个实验中。您的瓶颈显然是您的网络,而不是您的存储。即使情况并非如此,您也有足够的 RAM;因此,文件系统和块设备缓冲将使第二次访问文件的速度与文件已经在 RAM 磁盘中一样快,当然,除非某些其他软件需要 RAM 并且文件已从这些缓冲区中删除以获得空闲 RAM。但在那种情况下,那就是更差如果您的服务器将文件存储在 RAM 磁盘中:则该 RAM 需求要么会失败(并且某些内容会崩溃),要么会被内存不足杀手杀死(因此,您的系统将变得不可靠),或者该 RAM请求会将其他软件及其 RAM 中的数据推送到交换空间中,这会对性能产生灾难性影响,特别是如果这会影响 Web 服务器,并且它很可能会影响 Web 服务器,因为这在相当多的情况下无法为该文件提供服务是时候考虑将其驱逐了。
所以,总而言之:
- 不必要,因为存储不是您的瓶颈
- 没有必要,因为 RAM 缓存是 Linux 上免费提供的功能。在其他任何东西实际上需要大量 RAM 的情况下甚至可能有害。