0

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

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

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

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

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

2019-10-08 提问
4 个回答
1

已采纳

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

1

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

1

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

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

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

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

0

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

撰写答案

推广链接