swoole多进程写入日志文本,cpu占用100%

基于swoole的udp日志记录服务,使用task消息队列形式接受外部日志然后写入服务器中的文本文件中。

服务器配置是1核1G的linux系统,worker进程开启了2个,task进程开启了4个。

测试写入,使用外部客户端循环发送100W条日志,每条日志大小在200字节左右。客户端发送完这些数据耗时50秒,服务器接受到日志数据,多个task进程将日志写入的是同一个文本文件。服务器写入完这100W行日志大概耗时2-3分钟,期间cpu一直占用在100%。

是不是我写入文件的方式不对,我已经尽可能在每个task进程内复用文件句柄,避免重复打开文件了。

针对我这样的需求,利用swoole应该如何做呢,使用task队列是否正确呢?

阅读 5.7k
4 个回答

多进程写其实会造成文件锁竞争的问题,应该先写到缓存buffer中,然后定期将buffer内容输出到文件中。比如seaslog日志组件

1核1G的玩具,无法完美利用多进程性能的

日志不能这么直接落盘,不然性能很差

建议同时采用以下两种策略

  1. 开辟缓冲区,比如大小为1000,进来日志的时候判断缓冲区是否满了,满了就落盘

2.定时落盘,比如1分钟写一次文件

新手上路,请多包涵

日志存储已有文本更换为MongoDB.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题