面試的收穫

今天下午去深圳一家互聯網金融公司去面試, 雖然最後沒有通過,但是有所收穫。

面試官問了兩個問題,第一個問題是關於服務器最大併發量,第二個問題是服務器每秒鐘響應請求次數。結果慚愧,我都不知道,當初只知道這些數據運維那邊應該有,其作爲服務器開發人員,這些數據還有應該心裏要清楚的。所以,作爲程序員不能只是恁頭去寫代碼,更重要的是要知道自己寫的代碼起了多大的作用。對一件事情的量化可以使自己更好的去思考所做的事情,這是以前所缺少的。

再來說下這兩個問題。他說一個1G內存的服務器可以同時支持8W個鏈接,是他自己去試過的,是因爲每個socket鏈接再內核中都有8kb的buffer,外加一個文件描述符4kb,1024m/(12/1024) 約等於8W。我當初覺得好像挺有道理,但是後面一想,好像不對呀, 有些東西還沒有考慮進去。但是總體思考方向是正確的。

首選,操作系統會爲每個TCP鏈接分配一個TCP控制塊(TCB), 一天TCB大概要佔用1K左右的內存,其次是TCP的讀寫緩沖區分別佔用一些空間,可以通過cat /proc/sys/net/ipv4/tcp_rmem 和 cat /proc/sys/net/ipv4/tcp_wmem 查看,最後,在應用程序層次也是應該有接受隊列和發送隊列的,這些都是需要考慮的因素。

知乎上也有一個類似的問題epoll單機4G併發量最大能達到多少?

對於第二個問題,其實TPS指標,我也不知道,因爲沒做過具體的測試。

雖然感覺這些都和測試相關,但還是有必要去學習下。 再一個就是服務器上面打開的文件描述符是有限制的,既有整體的限制,又有相對於用戶的限制,還有先對於進程的限制,其中最後一點比較重要。也就是說,同時在線的人數是不能超過這個限制的。

總體來看,面試官想要考察的是對於服務器優化方面的知識。

相關連接: 關於TCP調優的具體操作可以Google,也可以從man7(tcp)上看到更詳細的信息

更新:
其實遊戲服務器和一般的web服務器還是有一些差異的,因爲遊戲中玩家和玩家直接是有互動的,但是web服務中客戶端之間是沒有關聯的,所以,一個玩家的狀態更新會涉及到廣播,這就使得在同樣的連接數下遊戲服務所處理的消息數遠遠增大;還有一點就是每個鏈接的狀態信息,遊戲服務器一般都是要保存每個玩家的狀態的,比如道具信息、等級之類的,這些都是要佔用很多資源的。