玩遊戲最怕什麼?當然是伺服器卡頓、延遲爆表,我自己在CentOS上架設過幾次遊戲伺服器,踩過不少坑,後來才摸索出一些真正管用的優化技巧。今天就來聊聊這些實戰經驗,希望能幫你省點時間,畢竟誰都不想看到玩家因為Lag而棄坑,對吧?
核心參數調整:從系統層級下手
很多人一拿到伺服器就急著裝遊戲,卻忽略了系統本身的調校。其實CentOS的預設核心參數是為通用場景設計的,對遊戲這種高即時性、高並發的應用來說,簡直是「拖後腿」。我習慣先調整 /etc/sysctl.conf 裡的幾個關鍵值,比如 net.core.somaxconn 和 net.ipv4.tcp_tw_reuse——前者控制監聽佇列長度,後者能重用TIME_WAIT狀態的連線,對大量短連線的遊戲(例如H5即時戰鬥)特別有效。另外,記得關掉 tcp_sack 和 tcp_timestamps,在某些場景下能降低CPU開銷,但要注意這可能影響高延遲網路的穩定性,建議先測試再上線。我曾經在一台4核8G的機器上,只靠調整這幾個參數,就把某款MMO的玩家同時在線數從800人撐到1200人,延遲反而降了15%,效果很明顯。
網路優化:減少延遲的關鍵
遊戲伺服器最怕的就是網路抖動,特別是那些需要即時同步的射擊或競速類遊戲。除了調整核心參數,網卡中斷親和性(IRQ Affinity)也是個容易被忽略的細節。你可以用 cat /proc/interrupts 查看網卡中斷號,然後透過 echo 指令將中斷綁定到特定CPU核心,避免所有中斷都擠在CPU0上。舉個例子,我曾經幫一個朋友優化他的《奔跑吧》H5伺服器,原本玩家反應技能釋放有延遲,後來把網卡中斷綁到核心2和3,同時把遊戲進程綁到核心0和1,結果平均延遲從80ms降到35ms,連技能冷卻的計時都準確多了。另外,千萬別忘了檢查防火牆規則——過多的iptables規則會增加每個封包的處理時間,能用nftables就換吧,效能差距不小。
進程與CPU綁定:讓遊戲更順暢
現代CPU都有多核心,但Linux預設的排程器不見得會把遊戲進程放在最合適的核心上。我習慣用 taskset 或 cset 工具,把遊戲主進程綁定到物理核心(避開超執行緒),同時把資料庫、日誌等輔助服務放到其他核心。這樣做的好處是減少快取未命中(cache miss),因為遊戲進程不會被頻繁切換到不同核心。記得有一次,我測試一款基於Node.js的H5遊戲,原本CPU使用率波動很大,綁定核心後波動幅度縮小一半,玩家端的FPS也穩定多了。另外,別忘了調整 ulimit 的開啟檔案數限制,很多遊戲伺服器崩潰不是因為程式碼有Bug,而是因為檔案描述符耗盡——這點我吃過虧,現在都會先設成65535以上。
儲存與記憶體:別讓I/O卡住你
遊戲伺服器對磁碟I/O的依賴往往被低估,尤其是那些頻繁寫入玩家數據或日誌的場景。CentOS預設的I/O排程器是 cfq,對遊戲來說太「公平」了,反而會增加延遲。我建議改成 deadline 或 noop(如果是SSD),能減少I/O請求的排隊時間。另外,記憶體方面,記得關閉 transparent_hugepages,雖然它能減少TLB未命中,但對即時性要求高的遊戲反而可能引入微卡頓。我習慣在 /etc/default/grub 裡加上 transparent_hugepage=never,重啟後用 cat /sys/kernel/mm/transparent_hugepage/enabled 確認。這些小細節加起來,就是讓伺服器「跑得更順」的關鍵。
說到底,優化沒有萬靈丹,每個遊戲的瓶頸都不一樣。建議你先用 perf 或 strace 分析一下實際運行時的熱點,再對症下藥。如果你有遇到什麼奇怪的卡頓問題,歡迎留言討論,我也很想聽聽你的解法。

評論(10)
这个参数调整真的有用,我之前调过somaxconn,效果明显
关tcp_sack要小心,我试过有些游戏反而更卡
IRQ亲和性具体怎么绑?我查/proc/interrupts但不知道哪个是网卡
好专业,先留着以后试
还有记得调整vm.swappiness,减少内存交换
我之前也是被文件描述符坑过,设到65535就稳了
我觉得cfq对SSD也没那么差,看场景吧
玩个游戏还要优化服务器,真折腾
那如果用的是NVMe SSD,I/O调度器选none还是deadline更好?
干货,挺实用的