有日志(stdout or file) qps 4k,没日志 qps 10w. why?

2022-07-22 00:29:54 +08:00
 dzdh

很简单的一个 echo 的 hello world 小 demo 。

wrk -c2000 -d10s -t6 http://localhost:8000/

use(logger)就 4k 的 qps (默认是 stdout ),不 use 就 10w 的 qps ??

因为同步输出到 stdout 需要时间嘛?那正式线上服务还需要考虑异步写日志咯?

搞个有 buffer 的 writer ?那 panic 的时候没来得及刷盘的日志咋弄。

3621 次点击
所在节点    Go 编程语言
33 条回复
zhengkai
2022-07-22 11:08:10 +08:00
盲猜一个每次文件都打开关闭,而 stdout 没有用 tmux 之类的,没有缓存真就会碰到阻塞

其实你应该贴 Logger 函数里面的内容,反倒贴了一堆没用的
nmap
2022-07-22 11:31:51 +08:00
用 zap 写文件试试
dzdh
2022-07-22 12:47:17 +08:00
zhengkai
2022-07-22 13:07:10 +08:00
@dzdh 你标题已经说了走的 stdout ,我说的是 stdout 可能在 terminal 这层被阻塞,结果你还是在重复说你走的 stdout ,估计是没听懂

要不这样,你启动的时候结尾加上 >/tmp/log.txt 2>&1 ,再跑一次看有区别没

看你贴的代码,这是你用的 log 库吧,说的是你怎么调的 Logger ,不是问你调的什么 Logger……

你骑共享单车 100 次、每次骑 10 米,跟你一次骑车骑 1000 米,是不一样的。扫码、解锁、停车、关锁的开销这一套下来,可能还没你走着快。这样能理解么

你这里,如果是个复杂的 log ,还有颜色高亮什么的,可能拼 log 的时间远大于写 log 的时间,但再大再复杂的 log 也不应该每秒 4k
Trim21
2022-07-22 14:16:35 +08:00
楼主代码用得应该是 echo 示例里面给的这个

https://github.com/labstack/echo/blob/master/middleware/logger.go#L227
CEBBCAT
2022-07-22 15:00:28 +08:00
@kiwi95 应该着眼于怎么消除 goroutine 里面的代码缺陷带来的 panic 吧。我觉得,欢迎交流
lsp7572
2022-07-22 16:23:00 +08:00
火焰图看看就知道,之前分析过日志,如果日志里有很多 format ,没处理好会涉及到很多反射调用,QPS 一大就非常耗性能,用 uber 的 zap 试试
pastor
2022-07-22 17:07:22 +08:00
@msg7086 #4 "你正式上线如果要跑 10w qps 的话还是单独开一台日志服务器吧"
都写到日志服务器难道不比写本机更慢吗。。。


@sadfQED2 #11 "3.线上服务写日志难道还有人不是异步的?"
比如金融级的业务,资金很重要,如果用异步、刚好宕机日志丢失了,那就不好了
#13 "开源的不知道,我呆过的公司日志框架都是内部实现的。写日志都是异步操作"
这些业务的安全等级不需要那么高,所以可以允许异步日志

@misaka19000 #16 同上面的回复

最后, @dzdh OP 可以按业务需要做日志选型,比如我上面说的。并且安全等级要求高的,比如金融级的,不差这点堆机器的硬件成本。如果是普通业务,异步也可
sadfQED2
2022-07-22 19:10:02 +08:00
@pastor 金融级别的,核心日志肯定得写数据库了,而且还得使用数据库事务提交。

如果要求日志不能丢,那只能控制日志的量了,线上服务使用 warning 以上的日志级别,并且严格控制日志数量
pastor
2022-07-22 20:26:43 +08:00
@sadfQED2 #29
不一样的,写数据库的那叫操作日志之类的,记录的东西不一样,比如 admin 操作之类的,是给管理人员用的。
程序日志主要是用于 debug 日志的,是给程序员用的。
msg7086
2022-07-23 00:45:54 +08:00
@pastor
1. 写到日志服务器可以异步
2. 金融级服务如果宕机,应该找硬件或操作系统公司索赔。
再者,如果是金融级服务,可以搞高可用,前端 LB 后端集群,基本不需要考虑宕机的问题。
不管怎么说,一旦量级到了 10w qps ,就不是一个人在一个论坛上问问就能搞定的了,怎么都需要一个团队和专业的有经验的架构师来搞了。
pastor
2022-07-24 13:57:29 +08:00
@msg7086
我说的是写日志服务器比写本机更慢,用相同的方式,都同步或者都异步,肯定是本机快。如果不考虑日志安全级别、也即不需要考虑异步的丢日志问题,那当然也能异步写本地了。
另外就是,异步写到日志服务器的硬件、配置耦合更高、还需要考虑短线重连之类的稳定性问题,而且是业务进程内的模块,远不如 ELK 拉日志之类的解耦(当然,也额外增加了运维成本,但是开发和代码相对解脱了一些)

索赔是依赖第三方的正常商业行为,但是在依赖第三方之前,自家的 debug 、故障修复能力也是应该尽量自己提升的。
这个安全级别日志是单节点的稳定性、故障恢复、debug 能力的范畴; LB 是处理扩容问题、分布式范畴。一个是单点内的问题,一个是集群扩容能力的问题,所以 LB 跟这个问题没有直接关系
lysS
2022-07-27 09:58:53 +08:00
不是很重要的日志可以加个缓冲

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

https://tanronggui.xyz/t/867876

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

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

© 2021 V2EX