對於一臺服務器來說,支撐千萬併發連接是一個挑戰,我們來看看有哪些限制,並且如何解決
首先是內存問題,默認設置下,系統爲每個tcp連接分配4k的rmem和4k的wmem,那麼一個連接需要8k的內存,1kw連接需要80G內存。
修改系統的這兩個配置,改爲1k的rmem和wmem,則需要的內存爲20G,實際使用中還會有其他的內存開銷,因此最好準備32G或更大的內存
sysctl -w net.ipv4.tcp_rmem=4096
sysctl -w net.ipv4.tcp_wmem=4096
然後是文件描述問題,系統允許打開的文件數是有限制的,默認值很小,應當修改
sysctl -w fs.file-max=10485760
還有單進程的文件數量限制,這個最大值只能到1048576,應當修改
echo ‘* soft nofile 1048576’ >> /etc/security/limits.conf #用戶單進程的最大文件數,用戶登錄時生效
echo ‘* hard nofile 1048576’ >> /etc/security/limits.conf #用戶單進程的最大文件數,用戶登錄時生效
ulimit -n 1048576 #用戶單進程的最大文件數 當前會話生效
由於一個進程最多能夠打開100w個文件,因此需要多進程來支持千萬連接,因此server需要運行多個服務器進程。