有关日志功能是否严重影响 web 框架效率?

2021-06-16 23:13:31 +08:00
 LeeReamond

发主题的时候主要想法是局限在 python 的异步框架,不过也很好奇其他语言的框架都用什么解决方案,所以标题里没有写明是 python 。

问题简单来说,我们都知道 python 的 IO 流,例如常见的 print,是一个同步阻塞操作。而目前网络端的解决方案在向异步非阻塞转移,比如 fastapi/aiohttp 这类框架,转移的同时,日志又是很重要的一个功能,总不可能一个服务没有日志。这是否意味着框架转发性能将被严重降低,有什么解决方案吗?

4360 次点击
所在节点    Python
27 条回复
lishunan246
2021-06-16 23:23:54 +08:00
日志可以用 syslog 或者 http 方式输出给专门的 agent 收集。
特别在意性能可以考虑换其他语言实现。
catcn
2021-06-16 23:25:46 +08:00
放内存,慢慢落磁盘,落得慢直接扔掉
binux
2021-06-16 23:28:22 +08:00
我们都知道 python 的 IO 流,例如常见的 print,是一个同步阻塞操作

不一定,看往哪写
joApioVVx4M4X6Rf
2021-06-16 23:39:02 +08:00
同问
LeeReamond
2021-06-16 23:39:31 +08:00
@lishunan246 不是很在意性能,业务不会在这里达到瓶颈,只是好奇通常是怎么处理的
nightwitch
2021-06-16 23:42:06 +08:00
单独起一个线程负责 IO,其他要写日志的往一个 queue 里写,这个线程从 queue 里拿到日志就往硬盘里写就好了。
falcon05
2021-06-16 23:42:36 +08:00
openresty 就提供了非阻塞日志函数 ngx.log
ikas
2021-06-17 00:19:43 +08:00
参考 java 平台,先有 slf4j 通用日志接口,然后有各种不同日志框架实现.比如 log4j2,logback. 他们都支持配置 Appender,根据不同 Appender 你可以实现写入文件,db,console,或者其他服务.他们也都支持配置为异步,减少对业务影响,提高性能.
同时,编写业务日志也要注意日志粒度,如果是 debug 日志也要先判断 debug level,减少日志拼接损耗
est
2021-06-17 00:28:07 +08:00
我就用的 udp 打日志到 es 。
abersheeran
2021-06-17 00:44:28 +08:00
我一般多线程+队列进行异步落盘。因为一般不用分析、追溯日志。

如果有单独的日志存放服务,比如楼上说的 es,那么就走 Unix Socket 、UDP 、TCP 之类的。
3dwelcome
2021-06-17 03:43:58 +08:00
"我们都知道 python 的 IO 流,例如常见的 print,是一个同步阻塞操作。"

先写在大片纯内存里,满了再刷到磁盘上。

过程就只是一个拷贝内存的开销,理论上能做到很快吧。
LeeReamond
2021-06-17 03:49:20 +08:00
@3dwelcome 没有这么单纯,物理上落盘虽然只有一次,但是你还是要先写回内核里,这个过程是同步阻塞的
neoblackcap
2021-06-17 04:53:39 +08:00
日志是走网络用 UDP 发到别的机器不就可以解决这些性能问题么?你的网络 IO 是同步非堵塞,性能只取决于你的发送。
xuanbg
2021-06-17 06:57:52 +08:00
@ikas 我们一般情况下不允许打日志。因为所有异常都统一捕获并输出日志了,网关也输出了接口调用参数、响应时间和返回数据的日志,业务里面也就不需要打日志了。偶尔遇到莫名其妙的问题,也是临时加点日志看一下帮助定位问题,用过后也是要删除才能上线的。
zjqzxc
2021-06-17 08:05:23 +08:00
python 的 logging 模块提供了多种 handler,看起来 DatagramHandler ( UDP 发送日志),MemoryHandler,QueueHandler 这几个也许能好点,可以试试看?
codehz
2021-06-17 08:18:07 +08:00
@LeeReamond 首先可以开线程写,即使 py,做系统调用的时候也会释放 gil 不会阻塞别的线程
其次,这不是还有 io-uring 异步读写方法吗(
myCupOfTea
2021-06-17 08:52:05 +08:00
确实影响效率.10%-20%左右
ScepterZ
2021-06-17 10:14:19 +08:00
测 echo 性能没有意义,得看你的业务运行要多久,比如直接 echo 0.01ms,log 0.1ms ,但是业务要 10ms,对于业务就没影响,但是你测 echo 性能就下降了 90%
LeeReamond
2021-06-17 10:59:36 +08:00
@ScepterZ 意义党可以退散了,我的绝大多数业务离框架瓶颈都很远,按照你的理论可以说大部分性能测试都没意义。我只是发个帖问问有没有人清楚 common practice
rockyliang
2021-06-17 11:18:56 +08:00
@xuanbg 网关把接口参数和返回数据都记录下来,请求量大的话,日志文件体积岂不是巨大?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/783838

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX