高流量服務器上,Session文件數量巨大(如20萬+)集中存放在/tmp目錄,導致內核CPU飆升、I/O wait嚴重,嚴重影響性能。本文提供完整優化方案。
使用tmpfs文件系統將/tmp掛載到內存,消除磁盤I/O瓶頸:
mount -t tmpfs -o size=512m tmpfs /tmp
永久生效請寫入/etc/fstab。
修改php.ini,開啟二級散列:
session.save_path = "2;/tmp/session"
含義:在/tmp/session下創建256×256=65536個子目錄,極大減少單目錄文件數。
PHP不會自動創建目錄,需手動執行腳本:
I="0 1 2 3 4 5 6 7 8 9 a b c d e f"
for acm in $I; do
for x in $I; do
mkdir -p /tmp/session/$acm/$x
done
done
chown -R nobody:nobody /tmp/session
chmod -R 1777 /tmp/session
因內存掛載重啟後失效,請將此腳本加入/etc/rc.local並在PHP-FPM啟動前執行。
Session過期後不會自動立即刪除,需配合cron定時清理:
find /tmp/session -amin +180 -exec rm -rf {} \;
設置為每10分鐘執行一次,配合session.gc_maxlifetime=10800(3小時)使用。
優化後,單目錄文件數從數十萬降至百級,I/O wait顯著下降,CPU佔用恢復正常,服務器穩定性大幅提升。