1. 永久修改 ulimit
二階段測試的 lotus daemon
在同步的時候,經常會出現 too many open files
錯誤,然后停止同步了。而且隨着你算力的增加,每次需要參與時空證明的扇區也會增多,到后面也同樣會出現too many open files
的錯誤。解決這個問題的方法是修改 ulimit
配置。
一般系統默認的是 1024, 穩妥起見我們可以設置其為 1048576。臨時修改 ulimit 我們可以使用如下操作:
ulimit -n 1048576
如果要永久設置,操作就復雜一些。首先,需要設置系統層面的 ulimit。
echo 'fs.file-max = 1048576' | sudo tee -a /etc/sysctl.conf sudo sysctl -p # 立即生效
然后在修改用戶層的配置:
sudo tee -a /etc/security/limits.conf << EOF * hard nofile 1048576 * soft nofile 1048576 root hard nofile 1048576 root soft nofile 1048576 EOF
然后修改 Systemd 層:
sudo sed -i '/DefaultLimitNOFILE/c DefaultLimitNOFILE=1048576' /etc/systemd/*.conf sudo systemctl daemon-reexec
如果你用來跑的網絡服務,通常你還需要設置最大 socket 連接數:
echo 'net.core.somaxconn=65535' | sudo tee -a /etc/sysctl.conf sudo sysctl -p # 立即生效
改完記得要重啟才能生效!!!
2. raid 重啟失效問題
這里順便先提一下硬 RAID 還是軟 RAID 的問題。硬 RAID 重建對資源占用率較低;軟RAID的話,重建的時候,吃CPU。硬 RAID 的算法其實更穩定點。但軟 RAID 性能會更好。
因為 RAID 卡上的 CACHE 一般也就是 512MB 或者 1GB,但軟RAID可以隨便利用系統的內存做 RAID STRIE CACHE。所以,簡單來說,如果你的 CPU 和內存資源有富余,那么就可以使用 RAID,否則建議使用硬 RAID。
在搭建 RAID 的時候,不知道大家有沒有遇到過這種情況,關機重啟之后,之前組的 RAID 設備不見了,存儲的數據也丟失了。我就遇到過好幾次。原因是沒有配置軟 RAID 的開機加載初始化。
解決方案如下:
mdadm -Ds >> /etc/mdadm/mdadm.conf
這樣在 /etc/mdadm/mdadm.conf
文件中就會出現類似如下的一行配置
ARRAY /dev/md0 metadata=1.2 name=lotus-miner:0 UUID=63dd2141:834e1dd0:b4173301:d483e824
其中 {name} 是你的主機 hostname
UUID 就 RAID 設備的 UUID。
這里順便貼上搭建 RAID 的腳本:
mdadm -Cv /dev/md0 -a yes -n 2 -l 0 /dev/sda /dev/sdb
其中參數 -n
是磁盤的數量,如果后面是分區的話,那就是分區的數量。 -l
參數代表你使用的 RAID 級別,0 代表 RAID0, 1 代表 RAID1,一次類推。
3. 關閉 Numa 功能
首先我們要搞清楚一件事情,為什么要關閉 NUMA?
Linux系統默認開啟NUMA,NUMA默認的內存分配策略是優先在進程所在CPU節點的本地內存中分配,會導致CPU節點之間內存分配不均衡。
比如當某個 CPU 節點的內存不足時,會導致 Swap 產生,而不是從遠程節點分配內存,即使另一個CPU節點上有足夠的物理內存。
這種內存分配策略的初衷是好的,為了內存更接近需要它的進程,但不適合大規模使用內存使用的應用場景,不利於充分利用系統的物理內存。
然而眾所周知,Filecoin 對內存的需求近乎貪婪。而且你會發現明還有幾十 GB 的物理內存,但是它偏偏卻加載了幾十 GB 的Swap。而一旦使用 Swap, 性能就立即下降內存的萬分之一甚至更低。
首先你需要檢查一下你的機器上是否已經開啟了 Numa 模式,可以使用 numastat
這個命令來查看,如果本機沒有這個命令的話,你需要先安裝 numactl
。
sudo apt-get install numactl
然后就可以使用 numastat
查看當前系統是否有啟用 Numa.
numastat node0 numa_hit 484417331 numa_miss 0 numa_foreign 0 interleave_hit 40687 local_node 484417331 other_node 0
如果你的機器跟我的一樣只有一個 node
的話,說明你不需要關閉 Numa 了,因為此時 Numa 根本沒有起作用。一般來說家用機器,CPU 的核數不會太高,所以不需要用到 Numa 來優化。
我在 E5-2684 V4
的機器上運行了一下,結果如下:
root@miner1:~# numastat node0 node1 numa_hit 2093513830 2859729719 numa_miss 949731552 128562031 numa_foreign 128562031 949731552 interleave_hit 51160 50655 local_node 2093549941 2859639315 other_node 949695441 128652435
從上面的結果來看,Numa 顯然是啟用的,CPU 和內存都被分配成 2 個 node。跨節點之間進行物理內存的訪問,性能會降低十倍。
禁用 Numa 有兩種方法,一種是通過 Bios 設置,不同的主板有不同的設置方法,這個我就不說了,大家根據自己的主板類型去網上找答案。
這里主要說下通過修改系統配置的方式禁用 Numa :
(1)CentOS 的 grub 配置文件修改,編輯 /etc/grub.conf
,找到kernel行,該行類似如下(不同的版本內容略有差異,但開頭有“kernel /vmlinuz-”):
kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/vg_centos64001-lv_root rd_NO_LUKS rd_LVM_LV=vg_centos64001/lv_root rd_NO_MD rd_LVM_LV=vg_centos64001/lv_swap \ crashkernel=128M LANG=zh_CN.UTF-8 KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
在kernel行的末尾,空格再添加 numa=off
,如果有多個 kernel 行,則每個 kernel 行都要添加。
(2)Ubuntu18.04 的 grub 文件修改,編輯 /boot/grub/grub.cfg
,找到 Linux 引導行,該行類似如下(不同版本內容略有差異,但開頭有 linux /boot/vmlinuz-
):
linux /boot/vmlinuz-4.15.0-106-generic root=UUID=2c5f7d8a-ff33-4c78-b5a4-cd8dc75823f3 ro maybe-ubiquity
在Linux引導行的末尾,空格再添加 numa=off
,如果有多個 Linux 引導行,則每個 Linux 引導行都要添加。
(3)修改后保存,再重啟系統,再驗證是否成功關閉 NUMA。
numastat
如果輸出結果中只有 node0,則表示成功禁用了NUMA,如果有 node1 出現則失敗。
4. 開啟 CPU 到高性能模式
Ubuntu 系統中默認 CPU 都是工作在 powersave
(省電)模式的,這樣性能沒有最大話,所以需要調整到 performance
(高性能)模式。你可以通過設置 Bios 或者通過軟件臨時調節。
1、安裝cpufrequtils:
sudo apt-get install cpufrequtils
2、查看當前cpu的狀態:
cpufreq-info
3、把cpu調整到性能模式:
sudo cpufreq-set -g performance