SendBufferToWorker fail. May be the send buffer are overflow. See http://wiki.workerman.net/Error2 for detail
提示這個(gè) 按照流程 去strace -p 查找其中一個(gè)端口 發(fā)現(xiàn)
ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(1, "SendBufferToWorker fail. May be "..., 110) = 110
open("/data/website/onlinekf/online/websocket-php/linux/workerman-chat/vendor/workerman/workerman.log", O_WRONLY|O_CREAT|O_APPEND, 0666) = 111
fstat(111, {st_mode=S_IFREG|0622, st_size=170306694472, ...}) = 0
lseek(111, 0, SEEK_CUR) = 0
lseek(111, 0, SEEK_CUR) = 0
flock(111, LOCK_EX) = 0
write(111, "2017-09-15 15:36:46 pid:21107 Se"..., 140) = 140
close(111) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(1, "SendBufferToWorker fail. May be "..., 110) = 110
open("/data/website/onlinekf/online/websocket-php/linux/workerman-chat/vendor/workerman/workerman.log", O_WRONLY|O_CREAT|O_APPEND, 0666) = 111
fstat(111, {st_mode=S_IFREG|0622, st_size=170306695452, ...}) = 0
lseek(111, 0, SEEK_CUR) = 0
lseek(111, 0, SEEK_CUR) = 0
flock(111, LOCK_EX) = 0
write(111, "2017-09-15 15:36:46 pid:21107 Se"..., 140) = 140
close(111) = 0
recvfrom(12438, "\201\217\247OL\243\334m8\332\327*n\231\205?#\315\300m1\201\217g\304\256A\34\346\3328\27"..., 65535, 0, NULL, NULL) = 420
ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(1, "SendBufferToWorker fail. May be "..., 110) = 110
open("/data/website/onlinekf/online/websocket-php/linux/workerman-chat/vendor/workerman/workerman.log", O_WRONLY|O_CREAT|O_APPEND, 0666) = 111
fstat(111, {st_mode=S_IFREG|0622, st_size=170306696572, ...}) = 0
lseek(111, 0, SEEK_CUR) = 0
lseek(111, 0, SEEK_CUR) = 0
flock(111, LOCK_EX) = 0
write(111, "2017-09-15 15:36:46 pid:21107 Se"..., 140) = 140
close(111) = 0
ioctl(1, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
write(1, "SendBufferToWorker fail. May be "..., 110) = 110
open("/data/website/onlinekf/online/websocket-php/linux/workerman-chat/vendor/workerman/workerman.log", O_WRONLY|O_CREAT|O_APPEND, 0666) = 111
fstat(111, {st_mode=S_IFREG|0622, st_size=170306697972, ...}) = 0
lseek(111, 0, SEEK_CUR) = 0
lseek(111, 0, SEEK_CUR) = 0
一直輸出這個(gè) 大神 求解答
報(bào)錯(cuò)的意思是gateway收到消息轉(zhuǎn)發(fā)給businessWorker處理,但是向businessWorker發(fā)送數(shù)據(jù)的發(fā)送緩沖區(qū)已經(jīng)滿了,無(wú)法發(fā)送。
如果客戶端發(fā)送請(qǐng)求的速度大于businessWorker的處理速度,并且這種情況持續(xù)一段時(shí)間后就會(huì)報(bào)這個(gè)錯(cuò)。比如客戶端每秒發(fā)送10000個(gè)請(qǐng)求給服務(wù)端,gateway收到請(qǐng)求后給businessWorker處理,businessWorker每秒只能處理9000個(gè)請(qǐng)求,那么請(qǐng)求就會(huì)積壓在緩沖區(qū),最終緩沖區(qū)滿了就報(bào)這個(gè)錯(cuò)了。
出現(xiàn)這個(gè)問(wèn)題這個(gè)一般是businessWorker處理不過(guò)來(lái)了導(dǎo)致的,看看Events.php里是否有處理很慢的業(yè)務(wù),businessWorker進(jìn)程數(shù)是否足夠(進(jìn)程數(shù)一般是cpu的3倍)。如果業(yè)務(wù)都o(jì)k,那么說(shuō)明此服務(wù)器配置+你的業(yè)務(wù)代碼無(wú)法支持這么大的請(qǐng)求量,可以通過(guò)分布式多服務(wù)器部署水平擴(kuò)展服務(wù)器來(lái)解決。
請(qǐng)問(wèn)這個(gè)緩沖區(qū)可以擴(kuò)大嗎 客戶端每10秒會(huì)給我發(fā)送心跳 我會(huì)記錄一些東西 可能是這個(gè)地方堵死了嗎?
進(jìn)程數(shù)是CPU的3倍?我看gateway進(jìn)程數(shù)建議與cpu核數(shù)相同 bussinessWorker進(jìn)程數(shù)量 和這個(gè)不一樣嗎?
start_gateway.php中 $gateway->sendToWorkerBufferSize來(lái)設(shè)置這個(gè)緩沖區(qū)大小,默認(rèn)10M