基于swoole的udp日志记录服务,使用task消息队列形式接受外部日志然后写入服务器中的文本文件中。
服务器配置是1核1G的linux系统,worker进程开启了2个,task进程开启了4个。
测试写入,使用外部客户端循环发送100W条日志,每条日志大小在200字节左右。客户端发送完这些数据耗时50秒,服务器接受到日志数据,多个task进程将日志写入的是同一个文本文件。服务器写入完这100W行日志大概耗时2-3分钟,期间cpu一直占用在100%。
是不是我写入文件的方式不对,我已经尽可能在每个task进程内复用文件句柄,避免重复打开文件了。
针对我这样的需求,利用swoole应该如何做呢,使用task队列是否正确呢?
多进程写其实会造成文件锁竞争的问题,应该先写到缓存buffer中,然后定期将buffer内容输出到文件中。比如seaslog日志组件