成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Swoole筆記(五)

zgbgx / 1170人閱讀

摘要:超過(guò)此數(shù)量后,新進(jìn)入的連接將被拒絕。表示連接最大允許空閑的時(shí)間。當(dāng)出錯(cuò)時(shí)底層會(huì)認(rèn)為是惡意連接,丟棄數(shù)據(jù)并強(qiáng)制關(guān)閉連接。在啟動(dòng)時(shí)自動(dòng)將進(jìn)程的寫入到文件,在關(guān)閉時(shí)自動(dòng)刪除文件。

配置說(shuō)明
$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è)置是否后臺(tái)運(yùn)行。默認(rèn)是false。設(shè)置daemonize => 1時(shí),程序?qū)⑥D(zhuǎn)入后臺(tái)作為守護(hù)進(jìn)程運(yùn)行。長(zhǎng)時(shí)間運(yùn)行的服務(wù)器端程序必須啟用此項(xiàng)。

如果不啟用守護(hù)進(jìn)程,當(dāng)ssh終端退出后,程序?qū)⒈唤K止運(yùn)行。

注意:

啟用守護(hù)進(jìn)程后,標(biāo)準(zhǔn)輸入和輸出會(huì)被重定向到 log_file。

如果未設(shè)置log_file,將重定向到 /dev/null,所有打印屏幕的信息都會(huì)被丟棄。

log_file

指定swoole錯(cuò)誤日志文件。在swoole運(yùn)行期發(fā)生的異常信息會(huì)記錄到這個(gè)文件中。默認(rèn)會(huì)打印到屏幕。

注意log_file不會(huì)自動(dòng)切分文件,所以需要定期清理此文件。通過(guò)重新打開(kāi)日志,可以實(shí)現(xiàn)按天記錄日志。

log_level

設(shè)置swoole_server錯(cuò)誤日志打印的等級(jí),范圍是0-5。低于log_level設(shè)置的日志信息不會(huì)拋出。默認(rèn)是0 也就是所有級(jí)別都打印。

0 =>DEBUG
1 =>TRACE
2 =>INFO
3 =>NOTICE
4 =>WARNING
5 =>ERROR
reactor_num

reactor線程數(shù),通過(guò)此參數(shù)來(lái)調(diào)節(jié)主進(jìn)程內(nèi)事件處理線程的數(shù)量,以充分利用多核。默認(rèn)會(huì)啟用CPU核數(shù)相同的數(shù)量。reactor_num一般設(shè)置為CPU核數(shù)的1-4倍,在swoole中reactor_num最大不得超過(guò)CPU核數(shù)*4。

Swoole的主進(jìn)程是一個(gè)多線程的程序。其中有一組很重要的線程,稱之為Reactor線程。它就是真正處理TCP連接,收發(fā)數(shù)據(jù)的線程。Reactor線程進(jìn)行協(xié)議解析,將請(qǐng)求投遞到Worker進(jìn)程。

推薦配置:CPU核數(shù)。

注意:reactor_num必須小于或等于worker_num。如果設(shè)置的reactor_num大于worker_num,那么swoole會(huì)自動(dòng)調(diào)整使reactor_num等于worker_num。

worker_num

設(shè)置啟動(dòng)的worker進(jìn)程數(shù)。worker_num >= 1,至少會(huì)有一個(gè),默認(rèn)是 1。設(shè)置方法:

業(yè)務(wù)代碼是全異步非阻塞的,這里設(shè)置為CPU的1-4倍最合理。

業(yè)務(wù)代碼為同步阻塞,需要根據(jù)請(qǐng)求響應(yīng)時(shí)間和系統(tǒng)負(fù)載來(lái)調(diào)整。

比如1個(gè)請(qǐng)求耗時(shí)100ms,要提供1000QPS的處理能力,那必須配置100個(gè)進(jìn)程或更多。但是需要考慮內(nèi)存占用。假設(shè)每個(gè)進(jìn)程占用40M內(nèi)存,那100個(gè)進(jìn)程就需要占用4G內(nèi)存。

推薦配置:CPU核數(shù)*2。

task_worker_num

配置task進(jìn)程的數(shù)量,配置此參數(shù)后將會(huì)啟用task功能。如果業(yè)務(wù)用不到異步任務(wù),可以不設(shè)置。一旦設(shè)置次參數(shù),必須設(shè)置onTask/onFinish2個(gè)事件回調(diào)。

注意:

task進(jìn)程內(nèi)不能使用swoole_server->task方法

task進(jìn)程內(nèi)不能使用mysql-async/redis-async/swoole_event等異步IO函數(shù)

推薦配置:根據(jù)實(shí)際異步任務(wù)比重設(shè)置。

dispatch_mode

數(shù)據(jù)包分發(fā)策略??梢赃x擇3種類型,默認(rèn)為2。一般情況下,HttpServer可以使用1、3;WebSocketServer可以使用默認(rèn)的2。

1,輪循模式,收到會(huì)輪循分配給每一個(gè)worker進(jìn)程。

2,固定模式,根據(jù)連接的文件描述符分配worker。這樣可以保證同一個(gè)連接發(fā)來(lái)的數(shù)據(jù)只會(huì)被同一個(gè)worker處理。

3,搶占模式,主進(jìn)程會(huì)根據(jù)Worker的忙閑狀態(tài)選擇投遞,只會(huì)投遞給處于閑置狀態(tài)的Worker。

4,IP分配,根據(jù)客戶端IP進(jìn)行取模hash,分配給一個(gè)固定的worker進(jìn)程??梢员WC同一個(gè)來(lái)源IP的連接數(shù)據(jù)總會(huì)被分配到同一個(gè)worker進(jìn)程。算法為 ip2long(ClientIP) % worker_num

5,UID分配,需要用戶代碼中調(diào)用 $serv->bind() 將一個(gè)連接綁定1個(gè)uid。然后swoole根據(jù)UID的值分配到不同的worker進(jìn)程。算法為 UID % worker_num,如果需要使用字符串作為UID,可以使用crc32(UID_STRING) 。

dispatch_mode配置在BASE模式是無(wú)效的,因?yàn)锽ASE不存在投遞任務(wù)。

max_request

設(shè)置worker進(jìn)程的最大任務(wù)數(shù),默認(rèn)為0。

這個(gè)參數(shù)的主要作用是解決PHP進(jìn)程內(nèi)存溢出問(wèn)題。一個(gè)worker進(jìn)程在處理完超過(guò)max_request數(shù)值的任務(wù)后將自動(dòng)退出,進(jìn)程退出后會(huì)釋放所有內(nèi)存和資源。

例如設(shè)置為3,假設(shè)有2個(gè)worker進(jìn)程,執(zhí)行5次請(qǐng)求,必然會(huì)有一個(gè)worker進(jìn)程會(huì)退出并被重新拉起一個(gè)新的。如果不設(shè)置,就不會(huì)執(zhí)行這個(gè)操作。

PHP應(yīng)用程序有緩慢的內(nèi)存泄漏,但無(wú)法定位到具體原因、無(wú)法解決,可以通過(guò)設(shè)置max_request解決。

如果代碼沒(méi)有內(nèi)存泄露的問(wèn)題,沒(méi)有每訪問(wèn)一次,內(nèi)存就增加一點(diǎn),那不設(shè)置(默認(rèn)為0)也不會(huì)有內(nèi)存泄露。反之,max_request,就可以限制內(nèi)存無(wú)限制增長(zhǎng),從而防止內(nèi)存泄露。(參考http://group.swoole.com/quest...

task_max_request

類似于max_request,默認(rèn)為5000。用于設(shè)置task進(jìn)程的最大任務(wù)數(shù)。一個(gè)task進(jìn)程在處理完超過(guò)此數(shù)值的任務(wù)后將自動(dòng)退出。這個(gè)參數(shù)是為了防止PHP進(jìn)程內(nèi)存溢出。如果不希望進(jìn)程自動(dòng)退出可以設(shè)置為0。

max_conn (max_connection)

服務(wù)器程序,最大允許的連接數(shù),如max_conn => 10000, 此參數(shù)用來(lái)設(shè)置Server最大允許維持多少個(gè)tcp連接。超過(guò)此數(shù)量后,新進(jìn)入的連接將被拒絕。

默認(rèn)值為ulimit -n的值。系統(tǒng)的ulimit -n可能太小,需要手動(dòng)設(shè)置。例如ulimit -n 65535

最大不得超過(guò)操作系統(tǒng)ulimit -n的值,否則會(huì)報(bào)一條警告信息,并重置為ulimit -n的值。

此參數(shù)不要調(diào)整的過(guò)大,根據(jù)機(jī)器內(nèi)存的實(shí)際情況來(lái)設(shè)置。

heartbeat_idle_time、heartbeat_check_interval

heartbeat_idle_time與heartbeat_check_interval配合使用。表示連接最大允許空閑的時(shí)間。如:

array(
    "heartbeat_idle_time" => 600, //表示連接最大允許空閑的時(shí)間
    "heartbeat_check_interval" => 60, //表示每隔少秒輪循一次
);

表示每60秒遍歷一次,一個(gè)連接如果600秒內(nèi)未向服務(wù)器發(fā)送任何數(shù)據(jù),此連接將被強(qiáng)制關(guān)閉。

啟用heartbeat_idle_time后,服務(wù)器并不會(huì)主動(dòng)向客戶端發(fā)送數(shù)據(jù)包,而是被動(dòng)等待客戶端發(fā)送心跳。

如果只設(shè)置了heartbeat_idle_time未設(shè)置heartbeat_check_interval底層將不會(huì)創(chuàng)建心跳檢測(cè)線程,PHP代碼中可以調(diào)用heartbeat方法手工處理超時(shí)的連接。

open_eof_check、package_eof

設(shè)置EOF字符串。package_eof最大只允許傳入8個(gè)字節(jié)的字符串。

array(
    "open_eof_check" => true, //打開(kāi)EOF檢測(cè)
    "package_eof" => "
", //設(shè)置EOF
)

打開(kāi)EOF檢測(cè),此選項(xiàng)將檢測(cè)客戶端連接發(fā)來(lái)的數(shù)據(jù),當(dāng)數(shù)據(jù)包結(jié)尾是指定的字符串時(shí)才會(huì)投遞給Worker進(jìn)程。否則會(huì)一直拼接數(shù)據(jù)包,直到超過(guò)緩存區(qū)或者超時(shí)才會(huì)中止。當(dāng)出錯(cuò)時(shí)swoole底層會(huì)認(rèn)為是惡意連接,丟棄數(shù)據(jù)并強(qiáng)制關(guān)閉連接。

常見(jiàn)的Memcache/SMTP/POP等協(xié)議都是以rn結(jié)束的,就可以使用此配置。開(kāi)啟后可以保證Worker進(jìn)程一次性總是收到一個(gè)或者多個(gè)完整的數(shù)據(jù)包。

open_eof_split

EOF檢測(cè)不會(huì)從數(shù)據(jù)中間查找eof字符串,所以Worker進(jìn)程可能會(huì)同時(shí)收到多個(gè)數(shù)據(jù)包,需要在應(yīng)用層代碼中自行explode(" ", $data) 來(lái)拆分?jǐn)?shù)據(jù)包。

1.7.15版本增加了open_eof_split,支持從數(shù)據(jù)中查找EOF,并切分?jǐn)?shù)據(jù)。

pid_file

在Server啟動(dòng)時(shí)自動(dòng)將master進(jìn)程的PID寫入到文件,在Server關(guān)閉時(shí)自動(dòng)刪除PID文件。(1.9.5+支持)

$server->set(array(
    "pid_file" => __DIR__."/server.pid",
));

其它參數(shù)詳見(jiàn):配置選項(xiàng)-Swoole-Swoole文檔中心
https://wiki.swoole.com/wiki/...

服務(wù)器調(diào)優(yōu)

常見(jiàn)優(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ù)直接運(yùn)行ulimit -SHn 65535即可,可以使用ulimit -n查看;
2、其它參數(shù)優(yōu)化示例:
net.core.somaxconn對(duì)應(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對(duì)應(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é)議??梢跃彺娴膱?bào)文數(shù)閥值,超過(guò)閥值的報(bào)文將被內(nèi)核丟棄
net.ipv4.tcp_max_syn_backlog = 3240000
 
# 調(diào)高 socket 偵聽(tīng)數(shù)閥值
net.core.somaxconn = 3240000
net.ipv4.tcp_max_tw_buckets = 1440000
 
# 調(diào)大 TCP 存儲(chǔ)大小
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、衍生開(kāi)源項(xiàng)目-Swoole-Swoole文檔中心
https://wiki.swoole.com/wiki/...
3、moell-peng/webim: PHP + Swoole 實(shí)現(xiàn)的簡(jiǎn)單聊天室
https://github.com/moell-peng...

參考

1、Server-Swoole-Swoole文檔中心
https://wiki.swoole.com/wiki/...
2、swoole_study/Swoole的進(jìn)程模型.md at master · szyhf/swoole_study
https://github.com/szyhf/swoo...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/25684.html

相關(guān)文章

  • PHP多進(jìn)程系列筆記

    摘要:消息隊(duì)列更常見(jiàn)的用途是主進(jìn)程分配任務(wù),子進(jìn)程消費(fèi)執(zhí)行。子進(jìn)程前面加了個(gè),這是為了防止父進(jìn)程還未往消息隊(duì)列中加入內(nèi)容直接退出。 前面幾節(jié)都是講解pcntl擴(kuò)展實(shí)現(xiàn)的多進(jìn)程程序。本節(jié)給大家介紹swoole擴(kuò)展的swoole_process模塊。 swoole多進(jìn)程 swoole_process 是swoole提供的進(jìn)程管理模塊,用來(lái)替代PHP的pcntl擴(kuò)展。 首先,確保安裝的swoole...

    qianfeng 評(píng)論0 收藏0
  • swoole 學(xué)習(xí)筆記swoole 真的優(yōu)秀一個(gè)框架

    摘要:所以,我感覺(jué)學(xué)習(xí),需要一個(gè)引導(dǎo)。學(xué)習(xí)參考鏈接喵星球特別厲害的一個(gè)官網(wǎng)的幾個(gè)框架文檔優(yōu)勢(shì)先看一下的結(jié)構(gòu)設(shè)計(jì)的應(yīng)用場(chǎng)景的設(shè)計(jì)項(xiàng)目中引入一個(gè)簡(jiǎn)易的具體參考一篇文章,集合和的簡(jiǎn)易實(shí)例項(xiàng)目中引入結(jié)合致敬 前期學(xué)完了操作系統(tǒng),特別是知道了進(jìn)程,線程 調(diào)度的問(wèn)題?;貋?lái)看,發(fā)現(xiàn)了很多細(xì)節(jié)。第三次看文檔,最初經(jīng)一個(gè)高手朋友的介紹,看swoole,說(shuō)文檔寫的賊好。但是看的時(shí)候,也是很一頭霧水,只知道把de...

    13651657101 評(píng)論0 收藏0
  • Swoole筆記(一)

    摘要:修復(fù)添加超過(guò)萬(wàn)個(gè)以上定時(shí)器時(shí)發(fā)生崩潰的問(wèn)題增加模塊,下高性能序列化庫(kù)修復(fù)監(jiān)聽(tīng)端口設(shè)置無(wú)效的問(wèn)題等。線程來(lái)處理網(wǎng)絡(luò)事件輪詢,讀取數(shù)據(jù)。當(dāng)?shù)娜挝帐殖晒α艘院螅蛇@個(gè)線程將連接成功的消息告訴進(jìn)程,再由進(jìn)程轉(zhuǎn)交給進(jìn)程。此時(shí)進(jìn)程觸發(fā)事件。 本文示例代碼詳見(jiàn):https://github.com/52fhy/swoo...。 簡(jiǎn)介 Swoole是一個(gè)PHP擴(kuò)展,提供了PHP語(yǔ)言的異步多線程服務(wù)器...

    SHERlocked93 評(píng)論0 收藏0
  • swoole 學(xué)習(xí)筆記

    摘要:安裝準(zhǔn)備或更高版本或更高版本安裝擴(kuò)展配置支持編輯在其中加入擴(kuò)展支持服務(wù)端代碼服務(wù)端客戶端代碼測(cè)試代碼在命令模式下輸入重新再開(kāi)一個(gè)窗口可以用檢測(cè)如服務(wù)端客戶端如上,表示服務(wù)端啟動(dòng),客戶端連接服務(wù)端返回消息,一個(gè)閉環(huán)形成開(kāi)發(fā)者頭條 1.安裝準(zhǔn)備 php-5.3.10 // 或更高版本 gcc-4.4 //或更高版本 make autoconf 2.安裝swoole擴(kuò)展 w...

    justCoding 評(píng)論0 收藏0
  • Swoole筆記(二)

    摘要:配置了參數(shù)后將會(huì)啟用功能,務(wù)必要注冊(cè)個(gè)事件回調(diào)函數(shù)。周期性定時(shí)器一次性定時(shí)器清除定時(shí)器定時(shí)器回調(diào)函數(shù)注意最大不得超過(guò)。進(jìn)程中不能添加定時(shí)器。建議在回調(diào)里寫定時(shí)器。定時(shí)器示例防止重復(fù)每隔觸發(fā)一次后執(zhí)行此函數(shù) 本文示例代碼詳見(jiàn):https://github.com/52fhy/swoo...。 重新打開(kāi)日志 在1.8.11及之后版本支持重新打開(kāi)日志:向Server主進(jìn)程發(fā)送SIGRTMIN...

    jsummer 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

zgbgx

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<