原先就有點(diǎn)擔(dān)心這個(gè)項(xiàng)目正式上線會(huì)出現(xiàn)各種問題,所以剛上線就趕緊查看日志
果然,頻繁出現(xiàn)錯(cuò)誤:
WARNING Server::accept_connection(): accept() failed, Error: Too many open files[24]
這個(gè)錯(cuò)誤通常是由于操作系統(tǒng)限制了進(jìn)程能夠打開的文件句柄數(shù)量,導(dǎo)致當(dāng)前進(jìn)程無(wú)法打開更多的文件,從而無(wú)法處理新的連接請(qǐng)求。
解決該問題的方法是增加系統(tǒng)限制的文件句柄數(shù)量,可以通過以下幾個(gè)步驟實(shí)現(xiàn):
-
執(zhí)行命令
ulimit -n
查看當(dāng)前系統(tǒng)限制的文件句柄數(shù)量; -
編輯文件
/etc/security/limits.conf
,添加以下兩行內(nèi)容:
?* soft nofile 65535 * hard nofile 65535
這兩行配置表示對(duì)所有用戶增加軟限制和硬限制的文件句柄數(shù)量都為 65535,也可以根據(jù)實(shí)際情況進(jìn)行修改;
-
保存文件并執(zhí)行命令
ulimit -n 65535
使設(shè)置立即生效; -
重啟系統(tǒng),讓修改的文件句柄數(shù)量限制生效
? ? ? ? ?
操作完以后發(fā)現(xiàn)還是不行,查看了下tcp的連接數(shù)量:
netstat -ant |grep ESTABLISHED |wc -l?
netstat -an | awk '/^tcp/ {++y[$NF]} END {for(w in y) print w, y[w]}'
發(fā)現(xiàn)連接數(shù)量超過1024的時(shí)候就會(huì)報(bào)上面那個(gè)錯(cuò)誤,因此想到應(yīng)該是tcp最大連接數(shù)量被限制為1024,修改tcp連接數(shù)需要以下幾個(gè)步驟:
? 1. 編輯文件 /etc/sysctl.conf
net.ipv4.conf.all.accept_redirects=0
net.ipv4.icmp_echo_ignore_all=1
vm.overcommit_memory = 0
net.core.somaxconn = 5120
fs.inotify.max_user_instances = 10240
fs.inotify.max_user_watches = 81920000
net.ipv4.tcp_max_tw_buckets = 524288
net.ipv4.tcp_keepalive_time = 1800
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
? ?2 . 執(zhí)行命令:? ? ?
sysctl -p
#如果想要直接修改某個(gè)參數(shù)的代碼
sysctl -w fs.inotify.max_user_instances=51200
本來(lái)以為已經(jīng)解決了,到了晚上重啟了下又出現(xiàn)了同樣的問題,重復(fù)查看已確認(rèn)(ESTABLISHED)的TCP連接,到了1080左右就報(bào)錯(cuò),后來(lái)想到是不是方向錯(cuò)了,應(yīng)該也查看下等待(TIME_WAIT)的TCP連接數(shù),發(fā)現(xiàn)等待的連接數(shù)超過了設(shè)置的數(shù)量,看來(lái)還是要詳細(xì)了解sysctl各參數(shù)的意義。
重啟以后還是出現(xiàn)這個(gè)報(bào)錯(cuò),結(jié)果還是看臉解決,繼續(xù)記錄下本次解決的流程:
killall php -9;
sysctl -w fs.inotify.max_user_instances=51200;
sysctl -p
執(zhí)行完上面的還是沒有解決,又重啟了TCP服務(wù)報(bào)錯(cuò)了,關(guān)掉改成先啟動(dòng)WS服務(wù),這時(shí)候可以了。這里面是不是有些什么關(guān)聯(lián),暫時(shí)不敢重啟了,下次重啟再看看是不是這個(gè)原因?
目前問題已經(jīng)解決,上面的sysctl就是最新的配置信息。
最后總結(jié)的問題就是物聯(lián)網(wǎng)那邊的模塊60秒就會(huì)發(fā)起一個(gè)tcp連接,之前的又沒有斷開,所以導(dǎo)致tcp連接一直在累計(jì),所以就需要設(shè)置sysctl各方面的參數(shù)了
后面又出現(xiàn)了這個(gè)報(bào)錯(cuò),還是按照上次解決的辦法來(lái)處理,應(yīng)該是因?yàn)榭偣策B接數(shù)超過上面配置的10240,改成51200就能解決。
運(yùn)行了一段時(shí)間以后主要數(shù)據(jù)是沒什么問題了,但是經(jīng)常出現(xiàn)?Cannot assign requested address 的報(bào)錯(cuò),導(dǎo)致有時(shí)候ws連接了以后,沒有接收到返回的消息,發(fā)現(xiàn)是TIME_WAIT的連接數(shù)太多了,那解決辦法就是減少端口被占用的清空,快速清理TIME_WAIT占用的端口,修改配置如下:
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_timestamps=1
net.ipv4.tcp_tw_recycle=1
觀察了幾天,之前總是報(bào)錯(cuò)的情況目前算是得到了解決。? ? ? ?
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-432834.html
????????文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-432834.html
到了這里,關(guān)于記一次swoole連接數(shù)太多導(dǎo)致的錯(cuò)誤的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!