Ash*_*har 4 linux memory swap dd ram
我能够自动检测 RAM(以 GB 为单位),如下所示,并四舍五入到最接近的整数:
printf "%.f\n" $(grep MemTotal /proc/meminfo | awk '$3=="kB"{$2=$2/1024^2;$3="GB";} 1' | awk '{print $2}')
Run Code Online (Sandbox Code Playgroud)
输出:
4
Run Code Online (Sandbox Code Playgroud)
我乘以 2 确定所需的交换空间为 8GB
ans=`expr $(printf "%.f\n" $(grep MemTotal /proc/meminfo | awk '$3=="kB"{$2=$2/1024^2;$3="GB";} 1' | awk '{print $2}')) \* 2`
echo "$ans"G
Run Code Online (Sandbox Code Playgroud)
输出:
8G
Run Code Online (Sandbox Code Playgroud)
通过以下命令,我尝试创建 8GB 交换内存。
echo "Creating $ans GB swap memory"
sudo dd if=/dev/zero of=/swapfile bs="$ans"G count=1048576
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
sudo swapon --show
Run Code Online (Sandbox Code Playgroud)
但是,我收到以下错误:
Creating 8 GB swap memory
dd: memory exhausted by input buffer of size 8589934592 bytes (8.0 GiB)
mkswap: error: swap area needs to be at least 40 KiB
swapon: /swapfile: read swap header failed.
Run Code Online (Sandbox Code Playgroud)
您能否建议并帮助我自动创建交换内存,理想情况下应该是 RAM 的两倍。
系统详细信息:
root@DKERP:~# uname -a
Linux DKERP 5.4.0-124-generic #140-Ubuntu SMP Thu Aug 4 02:23:37 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
root@DKERP:~# free -g -h -t
total used free shared buff/cache available
Mem: 3.8Gi 1.0Gi 207Mi 54Mi 2.6Gi 2.5Gi
Swap: 0B 0B 0B
Total: 3.8Gi 1.0Gi 207Mi
Run Code Online (Sandbox Code Playgroud)
cas*_*cas 11
dd您的命令不起作用的原因是您将 dd 的块大小设置为 8 GB。即您告诉它一次读取和写入 8 GiB,这将需要 8 GB 的 RAM 缓冲区。正如 Marcus 所说,8 GiB 比您拥有的 RAM 还要多,因此该大小的缓冲区将无法工作。
大约 80 亿兆字节(8 GiB x 1M = 8 peta字节,9,007,199,254,740,992 字节)比您拥有的磁盘空间要多得多......这比世界上大多数高端存储集群都多得多。
如果您为 bs 和 count 使用合理的值,它就会起作用。例如,1 MiB x 8K = 8 GiB:
dd if=/dev/zero of=/swapfile bs=1048576 count=8192
Run Code Online (Sandbox Code Playgroud)
或者
dd if=/dev/zero of=/swapfile bs=1M count=8K
Run Code Online (Sandbox Code Playgroud)
您明确指示dd将 RAM 大小两倍的块读入 RAM。那是不可能成功的。
相反,只是……不要那样做。