旧人新事
  • 3
  • 新人请关照

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队列是否正确呢?

阅读 916
评论
    4 个回答

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

    评论 赞赏
      宇润
      • 693

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

      评论 赞赏

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

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

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

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

        评论 赞赏
          旧人新事
          • 3
          • 新人请关照

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

          评论 赞赏
            撰写回答

            登录后参与交流、获取后续更新提醒