Linux

更快地創建交換文件

  • September 10, 2018

我正在使用 Amazon EC2 並希望能夠在實例啟動時快速生成大型交換文件 (~10+GB)。不幸的是,我的實例 (c1.xlarge) 上的 I/O 速度足夠慢 (20 MB/s),以至於此操作需要 10 分鐘以上,這對於我的使用來說是不可接受的。

我知道交換文件必須預先分配才能使用,這樣我就不能使用稀疏文件。

但是,是否有一些命令可以在不花費大量時間將塊歸零的情況下分配塊?此外,如果此命令存在,我是否正確假設交換文件中的頁面在使用者程序訪問它之前被清零(減輕安全問題)?

你沒有說明你試圖避免什麼方法。

傳統上,您會發出一個dd命令,該命令會依次抽出一個適當大小的零文件,然後執行mkswap,將條目添加到/etc/fstab,然後swapon啟動它。我附上了一個相當倉促編寫的範例 shell 腳本,我確定它有錯誤(我現在已經很晚了,fstab條目遠非完美)

#!/bin/bash
# --- allocate 10Gbyte of swap space as 10 separate 1Gbyte files
# --- that are brought online sequentially during processing
for swpidx in 01 02 03 04 05 06 07 08 09 10
do
 dd if=/dev/zero of=/swapfile.$swpidx bs=16738 count=65536
 mkswap /swapfile.$swpidx
 echo "/swapfile.$swpidx    swap    swap    default    0 0" >> /etc/fstab
 swapon -a
done
swapon -s

但是,聽起來您正試圖避免這種方法。 我可以提供的最快解決方案是使用交換分區,它不需要清零過程,並且可以在幾分鐘內上線。 如果您的實例正在執行 LVM,並且您有一個現有的捲組,您可以從中分割出一個分區,那也可以正常工作,並且分配可以在幾分鐘內完成。

我想我應該提一下,即使對於伺服器來說,開闢這種大小的交換空間也有點不尋常。我之所以這麼說,是因為大多數伺服器在處理這種大小的程序/數據時都附加了幾台 RAM。不要撬或任何東西,但你真的需要那麼多交換空間嗎?

您可能希望考慮的另一件事是重新調整工作負載,而不是嘗試動態分配交換空間。正如您自己指出的那樣,雖然擁有這麼多“按需”很棒,但由於伺服器實例上的 I/O 吞吐量緩慢,它很快就會成為瓶頸。當您耗盡記憶體並且基本上“生活在交換中”時,您會發現 20Mbyte/sec 的傳輸速率將您的實例變成了 386SX。

引用自:https://serverfault.com/questions/152733