What is the difference between TCP socket and Unix socket on PHP
PHP-FPM 主要提供 TCP socket 及 Unix socket 兩種協議連接的方式,但很少人知道其優缺點。
1. 理論上 Unix socket 比 TCP socket 快
TCP socket 是執行標準的網路協議,因此具有網路協議的開銷,而 Unix socket 則是直接調用作業系統的函式,所以理論上會比 TCP socket 來得快。
在我的實測環境中,採用 Unix socket 確實比 TCP socket 快 10% (500qps to 550qps)。
2. Unix socket 限於本機
因為 Unix socket 是作業系統調用函式,所以只能限於本機,但網路協議的 TCP socket 則可以交由另機處理。
3. Unix socket 在系統承載量高時,穩定性不如 TCP socket
這點就比較少人知道了。雖然 TCP socket 因為是標準的網路協議而較耗時,但也因此擁有了 TCP 的特性 - re-transmission
,這是 Unix socket 沒有的保險機制。
因此當系統承載量高時,無法處理的 PHP request 會暫時丟在 backlog;若 backlog 也滿載時,Unix socket 會直接回應失敗,但 TCP socket 會嘗試重試,直到成功或逾時。
補充:設定方式
Unix socket
listen = /var/run/php-fpm/php-fpm.socket
listen.backlog = 65535
TCP socket
listen = 127.0.0.1:9000
listen.backlog = 65535