请教如何打 log,性能最好

2022-07-11 16:58:37 +08:00
 ligiggy

如果每打一句 log ,就阻塞住,通过 filestream 往文件中写入一句 log ,写入很多次(比如 10000 次),多少会影响程序性能。

想请教各位大佬,性能最好的 log 方案是什么样的?

5122 次点击
所在节点    C++
31 条回复
jones2000
2022-07-11 22:23:18 +08:00
开个线程单独写呗。
foxtalk
2022-07-11 23:04:33 +08:00
zlog 还不错,接口比较简单,效率不错
SoarSoga
2022-07-11 23:16:03 +08:00
log 到控制台,在关键的地方才 log ,其他的直接 minidump 了
Caturra
2022-07-11 23:31:55 +08:00
简单点做个多生产者-单消费者模型就可以了,写到缓冲的线程为当前正在操作的线程,缓冲写到文件的线程为单独的后台线程。按这种思路,一万次操作跟玩一样,自己写过测过总共也就 2ms 耗时
不想写的话用 spdlog 之类的吧
bthulu
2022-07-12 08:37:01 +08:00
直接写文件就行了, SSD 自身就有缓存, 不需要你来考虑缓存问题
djoiwhud
2022-07-12 09:28:34 +08:00
纠正一下,文件写的执行是系统中断。也就是中断进程调度。并非写 10000 次,就有一万次中断执行。可能,我说的是可能,你写 10000 次,中断只执行了 100 次。

这个问题在 mysql 上面是重点问题。实际上 mysql 默认的文件写操作,是非实时的。有一点延迟,碰到宕机,可能会出现 sql 执行成功但是文件没保存的情况。强如 mysql 这类,都只能做取舍。

如果性能要求极高,可以考虑 mmap ,mysql 也有用 mmap 做文件写操作。但是实现方案真的繁杂。做稳定很难,而且极消耗内存。

不过我觉得是不是应该想想为什么要单节点追求无敌的文件写的性能?是全球领先的需求场景么?方案调整一下说不定根本没有这个问题。
djoiwhud
2022-07-12 09:35:21 +08:00
日志 io 问题,只在机械硬盘上面比较显著,现在的 ssd 都可以做到 gb 级别读写,比机械硬盘提升了几十倍。

另外,ssd 是随机不敏感的存储,对数据库的优化特别重要。因为日志文件写是连续 io ,不是随机 io ,不像数据库那样特别需要 ssd 的随机不敏感特性。


如果不考虑数据丢失的问题,写到内存再批量写文件,肯定是可以优化问题的。

最后,我感觉你的忧虑应该是不存在的。
ligiggy
2022-07-12 09:44:51 +08:00
@djoiwhud 我的行业偏向嵌入式,没有 SSD ,硬盘性能很差。不过还是可以试试 缓存到内存里面,再开线程写入到文件的操作。
Mogamigawa
2022-07-12 13:12:19 +08:00
我才不管这些,日志狂魔就是我
byaiu
2022-07-12 14:10:59 +08:00
fmtlog 延时还可以,要吞吐的话,可以用 nanolog 。但是 nanolog 查看的时候就不太方便了。
JohnBull
2022-09-21 13:39:39 +08:00
发 UDP 包,让别的机器去做性能最好,不接受反驳

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

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

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

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

© 2021 V2EX