webman 的日志是同步写入还是异步写入的

缝合

问题描述 如题 webman 的日志是同步写入还是异步写入的

截图

为此你搜索到了哪些方案及不适用的原因

想咨询一下。前几天在其他项目改了下异步日志(非php)效果还是杠杠的。

1205 8 1
8个回答

walkor

同步

  • wentmac 2023-06-28

    后期有没有计划改造成异步日志,异步日志在项目中使用性能肯定又能提高

  • six 2023-06-28

    现在服务器都ssd,写入很快,日志没必要异步。

    class IndexController
    {
        public function index(Request $request)
        {
            Log::info(str_pad('', 500, '0'));
            return 'ok';
        }
    }

    截图
    windows单进程压测每个请求磁盘写入500字节数据,QPS为高达3.7万,也就是说单进程平均每次写入500字节的日志仅需0.00002秒。然而一次数据库读写0.001秒都算快的了。在那0.00002秒上优化感觉没啥必要。

  • six 2023-06-28

    上面压测是单进程的,多进程应该速度更快。

  • 缝合 2023-06-28

    如果写5/10次呢。如果一个接口写入日志的次数变多,很明显的。当然不是所有的接口都有大量的日志写入。但是同步日志其实是很明显的,而且日志写入一旦占了大头的时候,多线程也没办法拯救的。所有的都会阻塞在写入这一点。多线程利用了cpu. https://learnku.com/laravel/t/63523

  • six 2023-06-28

    如果日志写入占大头,比较划算的方案是适当多开一些进程,能有效提高吞吐量。
    稍微复杂一点的,可以写一个monolog的handler,收集合并日志,当日志达到一个磁盘块比如4k的时候写入磁盘,最大限度降低磁盘写入开销。

  • 缝合 2023-06-28

    monolog 只可以做到集中写。异步的话,还是得做不小的改造。如果日志通过其他手段发送到日志服务器的话,你说的这个方案也可以。但是如果是本机的话,开多了也会被频繁的写等待所拖累。提升不了多少的。

  • 小阳光 2023-07-31

    能有提升,我写过,在超过一定大小或者超过一定时间再一次性写入磁盘

bigman

截图
异步文件系统 I/O (使用 eio).
可以试试是否可以集成在workerman上面

  • 暂无评论
chaz6chez

日志一般都是依赖monolog,主要是为了统一标准;
自己如果想折腾异步,最简单的方式就是自行实现monolog的handler;
当然monolog本身也一定程度支持异步,你使用他的redishandler或者amqphandler,然后消费端做日志落库/文件;
当然如果你想折腾异步io,那么可以安装libeio的php-ext eio,然后自行根据monolog handler来实现基于eio的异步文件写入即可。

  • bigman 2023-06-28

    bingo :)

  • damao 2023-06-28

    redishandler和amqphandler感觉性能也达不到题主要求,因为走网络IO往往比本地磁盘更慢,虽然可以非阻塞调用,但是资源代价很大。eio感觉也不行,因为要调用eio_event_loop,猜测这个调用也是阻塞的。
    建议自己实现monolog的handler,handler建立缓冲区缓冲日志,然后利用webman的event-loop(要用select,不能用epoll),在磁盘可写时写入日志。

    当然阻塞IO比较多想提高并发最简单的方案是多开一些进程。

  • chaz6chez 2023-06-28

    缓冲区做日志的前提也得是消费能力>生产能力,不然缓冲区满了一样有问题,用共享内存吧,把日志丢APCu,然后下游多个进程去写,这样走的是共享内存,没有文件io没有网络io,是最快的,只不过就是APCu有读写锁罢了,但是也够用了。

nitron

如果是单机应用,我一般都会把log写到/dev/shm里,反正一天就顶多1G,计划任务每天移动到实盘上,缺点就是关机重启的话没落实盘的数据就没了,但既然是单机应用了,这个问题可以忽略

多机器的话其实也可以,无非是落到实盘再加个合并操作

  • 暂无评论
pader

Wind Framework 日志组件异步写入,可以参考这里的实现。
https://wind-framework.github.io/docs/#/v0/zh-cn/component/log?id=%e5%bc%82%e6%ad%a5%e5%86%99%e5%85%a5

  • 暂无评论
happy321

每个请求写日志的同步的,多个请求是多个进程 互不干扰的

  • 暂无评论
世上走一回

1,可以用sealog扩展
2,可以用filber扩展

  • 暂无评论
8355

日志同步写入和同步刷盘是两个概念
大部分人是没搞清楚这点吧。。

  • 暂无评论
🔝