摘要:超過此數(shù)量后,新進入的連接將被拒絕。表示連接最大允許空閑的時間。當出錯時底層會認為是惡意連接,丟棄數(shù)據(jù)并強制關(guān)閉連接。在啟動時自動將進程的寫入到文件,在關(guān)閉時自動刪除文件。
配置說明
$server->set(array( "daemonize" => true, "log_file" => "/www/log/swoole.log", "reactor_num" => 2, "worker_num" => 2, "task_worker_num" => 4, "max_request" => 100, ));daemonize
設(shè)置是否后臺運行。默認是false。設(shè)置daemonize => 1時,程序?qū)⑥D(zhuǎn)入后臺作為守護進程運行。長時間運行的服務(wù)器端程序必須啟用此項。
如果不啟用守護進程,當ssh終端退出后,程序?qū)⒈唤K止運行。
注意:
啟用守護進程后,標準輸入和輸出會被重定向到 log_file。
如果未設(shè)置log_file,將重定向到 /dev/null,所有打印屏幕的信息都會被丟棄。
log_file指定swoole錯誤日志文件。在swoole運行期發(fā)生的異常信息會記錄到這個文件中。默認會打印到屏幕。
注意log_file不會自動切分文件,所以需要定期清理此文件。通過重新打開日志,可以實現(xiàn)按天記錄日志。
log_level設(shè)置swoole_server錯誤日志打印的等級,范圍是0-5。低于log_level設(shè)置的日志信息不會拋出。默認是0 也就是所有級別都打印。
0 =>DEBUG 1 =>TRACE 2 =>INFO 3 =>NOTICE 4 =>WARNING 5 =>ERRORreactor_num
reactor線程數(shù),通過此參數(shù)來調(diào)節(jié)主進程內(nèi)事件處理線程的數(shù)量,以充分利用多核。默認會啟用CPU核數(shù)相同的數(shù)量。reactor_num一般設(shè)置為CPU核數(shù)的1-4倍,在swoole中reactor_num最大不得超過CPU核數(shù)*4。
Swoole的主進程是一個多線程的程序。其中有一組很重要的線程,稱之為Reactor線程。它就是真正處理TCP連接,收發(fā)數(shù)據(jù)的線程。Reactor線程進行協(xié)議解析,將請求投遞到Worker進程。
推薦配置:CPU核數(shù)。
注意:reactor_num必須小于或等于worker_num。如果設(shè)置的reactor_num大于worker_num,那么swoole會自動調(diào)整使reactor_num等于worker_num。
worker_num設(shè)置啟動的worker進程數(shù)。worker_num >= 1,至少會有一個,默認是 1。設(shè)置方法:
業(yè)務(wù)代碼是全異步非阻塞的,這里設(shè)置為CPU的1-4倍最合理。
業(yè)務(wù)代碼為同步阻塞,需要根據(jù)請求響應(yīng)時間和系統(tǒng)負載來調(diào)整。
比如1個請求耗時100ms,要提供1000QPS的處理能力,那必須配置100個進程或更多。但是需要考慮內(nèi)存占用。假設(shè)每個進程占用40M內(nèi)存,那100個進程就需要占用4G內(nèi)存。
推薦配置:CPU核數(shù)*2。
task_worker_num配置task進程的數(shù)量,配置此參數(shù)后將會啟用task功能。如果業(yè)務(wù)用不到異步任務(wù),可以不設(shè)置。一旦設(shè)置次參數(shù),必須設(shè)置onTask/onFinish2個事件回調(diào)。
注意:
task進程內(nèi)不能使用swoole_server->task方法
task進程內(nèi)不能使用mysql-async/redis-async/swoole_event等異步IO函數(shù)
推薦配置:根據(jù)實際異步任務(wù)比重設(shè)置。
dispatch_mode數(shù)據(jù)包分發(fā)策略??梢赃x擇3種類型,默認為2。一般情況下,HttpServer可以使用1、3;WebSocketServer可以使用默認的2。
1,輪循模式,收到會輪循分配給每一個worker進程。
2,固定模式,根據(jù)連接的文件描述符分配worker。這樣可以保證同一個連接發(fā)來的數(shù)據(jù)只會被同一個worker處理。
3,搶占模式,主進程會根據(jù)Worker的忙閑狀態(tài)選擇投遞,只會投遞給處于閑置狀態(tài)的Worker。
4,IP分配,根據(jù)客戶端IP進行取模hash,分配給一個固定的worker進程??梢员WC同一個來源IP的連接數(shù)據(jù)總會被分配到同一個worker進程。算法為 ip2long(ClientIP) % worker_num。
5,UID分配,需要用戶代碼中調(diào)用 $serv->bind() 將一個連接綁定1個uid。然后swoole根據(jù)UID的值分配到不同的worker進程。算法為 UID % worker_num,如果需要使用字符串作為UID,可以使用crc32(UID_STRING) 。
dispatch_mode配置在BASE模式是無效的,因為BASE不存在投遞任務(wù)。
max_request設(shè)置worker進程的最大任務(wù)數(shù),默認為0。
這個參數(shù)的主要作用是解決PHP進程內(nèi)存溢出問題。一個worker進程在處理完超過max_request數(shù)值的任務(wù)后將自動退出,進程退出后會釋放所有內(nèi)存和資源。
例如設(shè)置為3,假設(shè)有2個worker進程,執(zhí)行5次請求,必然會有一個worker進程會退出并被重新拉起一個新的。如果不設(shè)置,就不會執(zhí)行這個操作。
PHP應(yīng)用程序有緩慢的內(nèi)存泄漏,但無法定位到具體原因、無法解決,可以通過設(shè)置max_request解決。
如果代碼沒有內(nèi)存泄露的問題,沒有每訪問一次,內(nèi)存就增加一點,那不設(shè)置(默認為0)也不會有內(nèi)存泄露。反之,max_request,就可以限制內(nèi)存無限制增長,從而防止內(nèi)存泄露。(參考http://group.swoole.com/quest...
task_max_request類似于max_request,默認為5000。用于設(shè)置task進程的最大任務(wù)數(shù)。一個task進程在處理完超過此數(shù)值的任務(wù)后將自動退出。這個參數(shù)是為了防止PHP進程內(nèi)存溢出。如果不希望進程自動退出可以設(shè)置為0。
max_conn (max_connection)服務(wù)器程序,最大允許的連接數(shù),如max_conn => 10000, 此參數(shù)用來設(shè)置Server最大允許維持多少個tcp連接。超過此數(shù)量后,新進入的連接將被拒絕。
默認值為ulimit -n的值。系統(tǒng)的ulimit -n可能太小,需要手動設(shè)置。例如ulimit -n 65535。
最大不得超過操作系統(tǒng)ulimit -n的值,否則會報一條警告信息,并重置為ulimit -n的值。
此參數(shù)不要調(diào)整的過大,根據(jù)機器內(nèi)存的實際情況來設(shè)置。
heartbeat_idle_time、heartbeat_check_intervalheartbeat_idle_time與heartbeat_check_interval配合使用。表示連接最大允許空閑的時間。如:
array( "heartbeat_idle_time" => 600, //表示連接最大允許空閑的時間 "heartbeat_check_interval" => 60, //表示每隔少秒輪循一次 );
表示每60秒遍歷一次,一個連接如果600秒內(nèi)未向服務(wù)器發(fā)送任何數(shù)據(jù),此連接將被強制關(guān)閉。
啟用heartbeat_idle_time后,服務(wù)器并不會主動向客戶端發(fā)送數(shù)據(jù)包,而是被動等待客戶端發(fā)送心跳。
如果只設(shè)置了heartbeat_idle_time未設(shè)置heartbeat_check_interval底層將不會創(chuàng)建心跳檢測線程,PHP代碼中可以調(diào)用heartbeat方法手工處理超時的連接。
open_eof_check、package_eof設(shè)置EOF字符串。package_eof最大只允許傳入8個字節(jié)的字符串。
array( "open_eof_check" => true, //打開EOF檢測 "package_eof" => " ", //設(shè)置EOF )
打開EOF檢測,此選項將檢測客戶端連接發(fā)來的數(shù)據(jù),當數(shù)據(jù)包結(jié)尾是指定的字符串時才會投遞給Worker進程。否則會一直拼接數(shù)據(jù)包,直到超過緩存區(qū)或者超時才會中止。當出錯時swoole底層會認為是惡意連接,丟棄數(shù)據(jù)并強制關(guān)閉連接。
常見的Memcache/SMTP/POP等協(xié)議都是以rn結(jié)束的,就可以使用此配置。開啟后可以保證Worker進程一次性總是收到一個或者多個完整的數(shù)據(jù)包。
open_eof_splitEOF檢測不會從數(shù)據(jù)中間查找eof字符串,所以Worker進程可能會同時收到多個數(shù)據(jù)包,需要在應(yīng)用層代碼中自行explode(" ", $data) 來拆分數(shù)據(jù)包。
1.7.15版本增加了open_eof_split,支持從數(shù)據(jù)中查找EOF,并切分數(shù)據(jù)。
pid_file在Server啟動時自動將master進程的PID寫入到文件,在Server關(guān)閉時自動刪除PID文件。(1.9.5+支持)
$server->set(array( "pid_file" => __DIR__."/server.pid", ));
其它參數(shù)詳見:配置選項-Swoole-Swoole文檔中心
https://wiki.swoole.com/wiki/...
常見優(yōu)化參數(shù):
# 內(nèi)核優(yōu)化 ulimit -n 65535 net.core.somaxconn = 262144 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_syncookies = 1 # nginx優(yōu)化 worker_rlimit_nofile 65535; use epoll; worker_connections 65535; keepalive_timeout 60;
內(nèi)核優(yōu)化如何修改:
1、ulimit參數(shù)直接運行ulimit -SHn 65535即可,可以使用ulimit -n查看;
2、其它參數(shù)優(yōu)化示例:
net.core.somaxconn對應(yīng)文件/proc/sys/net/core/somaxconn:
# 查看 cat /proc/sys/net/core/somaxconn # 修改 echo 65535 > /proc/sys/net/core/somaxconn
net.ipv4.tcp_tw_recycle對應(yīng)文件/proc/sys/net/ipv4/tcp_tw_recycle:
# 查看 cat /proc/sys/net/ipv4/tcp_tw_recycle # 修改 echo 65535 > /proc/sys/net/ipv4/tcp_tw_recycle
3、也可以修改/etc/sysctl.conf文件:
# 調(diào)高系統(tǒng)的 IP 以及端口數(shù)據(jù)限制,從可以接受更多的連接 net.ipv4.ip_local_port_range = 2000 65000 net.ipv4.tcp_window_scaling = 1 # 設(shè)置協(xié)議??梢跃彺娴膱笪臄?shù)閥值,超過閥值的報文將被內(nèi)核丟棄 net.ipv4.tcp_max_syn_backlog = 3240000 # 調(diào)高 socket 偵聽數(shù)閥值 net.core.somaxconn = 3240000 net.ipv4.tcp_max_tw_buckets = 1440000 # 調(diào)大 TCP 存儲大小 net.core.rmem_default = 8388608 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216 net.ipv4.tcp_congestion_control = cubic # tcp重新回收 net.ipv4.tcp_tw_recycle = 1 net.ipv4.tcp_tw_reuse = 1
修改配置之后需要執(zhí)行以下命令使之生效:
sysctl -p /etc/sysctl.conf相關(guān)應(yīng)用
1、https://github.com/matyhtf/fr...
2、衍生開源項目-Swoole-Swoole文檔中心
https://wiki.swoole.com/wiki/...
3、moell-peng/webim: PHP + Swoole 實現(xiàn)的簡單聊天室
https://github.com/moell-peng...
1、Server-Swoole-Swoole文檔中心
https://wiki.swoole.com/wiki/...
2、swoole_study/Swoole的進程模型.md at master · szyhf/swoole_study
https://github.com/szyhf/swoo...
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/25684.html
摘要:消息隊列更常見的用途是主進程分配任務(wù),子進程消費執(zhí)行。子進程前面加了個,這是為了防止父進程還未往消息隊列中加入內(nèi)容直接退出。 前面幾節(jié)都是講解pcntl擴展實現(xiàn)的多進程程序。本節(jié)給大家介紹swoole擴展的swoole_process模塊。 swoole多進程 swoole_process 是swoole提供的進程管理模塊,用來替代PHP的pcntl擴展。 首先,確保安裝的swoole...
摘要:所以,我感覺學(xué)習(xí),需要一個引導(dǎo)。學(xué)習(xí)參考鏈接喵星球特別厲害的一個官網(wǎng)的幾個框架文檔優(yōu)勢先看一下的結(jié)構(gòu)設(shè)計的應(yīng)用場景的設(shè)計項目中引入一個簡易的具體參考一篇文章,集合和的簡易實例項目中引入結(jié)合致敬 前期學(xué)完了操作系統(tǒng),特別是知道了進程,線程 調(diào)度的問題。回來看,發(fā)現(xiàn)了很多細節(jié)。第三次看文檔,最初經(jīng)一個高手朋友的介紹,看swoole,說文檔寫的賊好。但是看的時候,也是很一頭霧水,只知道把de...
摘要:修復(fù)添加超過萬個以上定時器時發(fā)生崩潰的問題增加模塊,下高性能序列化庫修復(fù)監(jiān)聽端口設(shè)置無效的問題等。線程來處理網(wǎng)絡(luò)事件輪詢,讀取數(shù)據(jù)。當?shù)娜挝帐殖晒α艘院螅蛇@個線程將連接成功的消息告訴進程,再由進程轉(zhuǎn)交給進程。此時進程觸發(fā)事件。 本文示例代碼詳見:https://github.com/52fhy/swoo...。 簡介 Swoole是一個PHP擴展,提供了PHP語言的異步多線程服務(wù)器...
摘要:安裝準備或更高版本或更高版本安裝擴展配置支持編輯在其中加入擴展支持服務(wù)端代碼服務(wù)端客戶端代碼測試代碼在命令模式下輸入重新再開一個窗口可以用檢測如服務(wù)端客戶端如上,表示服務(wù)端啟動,客戶端連接服務(wù)端返回消息,一個閉環(huán)形成開發(fā)者頭條 1.安裝準備 php-5.3.10 // 或更高版本 gcc-4.4 //或更高版本 make autoconf 2.安裝swoole擴展 w...
摘要:配置了參數(shù)后將會啟用功能,務(wù)必要注冊個事件回調(diào)函數(shù)。周期性定時器一次性定時器清除定時器定時器回調(diào)函數(shù)注意最大不得超過。進程中不能添加定時器。建議在回調(diào)里寫定時器。定時器示例防止重復(fù)每隔觸發(fā)一次后執(zhí)行此函數(shù) 本文示例代碼詳見:https://github.com/52fhy/swoo...。 重新打開日志 在1.8.11及之后版本支持重新打開日志:向Server主進程發(fā)送SIGRTMIN...
閱讀 1080·2023-04-26 02:21
閱讀 2883·2021-09-24 09:47
閱讀 1671·2019-08-30 15:55
閱讀 2244·2019-08-30 14:01
閱讀 2402·2019-08-29 14:01
閱讀 2116·2019-08-29 12:46
閱讀 881·2019-08-26 13:27
閱讀 2031·2019-08-26 12:23