Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

程序爆掉 #44

Closed
molixiaoge opened this issue Jul 9, 2016 · 6 comments
Closed

程序爆掉 #44

molixiaoge opened this issue Jul 9, 2016 · 6 comments

Comments

@molixiaoge
Copy link

随便开两个线程一直写,半分钟吃掉2g内存.看了一下代码每次申请80k,设计的比较暴力

@zsummer
Copy link
Owner

zsummer commented Jul 9, 2016

是8K啊 不是80K. 日志量持续超过硬盘写能力 就会爆炸!

@molixiaoge
Copy link
Author

恩,也就是说生产者和消费者不是平衡的,3秒就爆了.

@molixiaoge
Copy link
Author

这个问题准备改进么?或者是设计如此?

@zsummer
Copy link
Owner

zsummer commented Aug 18, 2016

如果采用异步写日志 就会有这个超负载的问题.
log4z 应用场景是服务器debug日志, 这个量和硬盘的顺序写入能力相比 是很小的, 就是说 实际上log4z的目标使用环境中不会出现这种情况.
延伸一下 即使用在客户端或者移动客户端 也是同样的不会出现.

另外 log4z支持同步写日志 因为不存在异步 所以也不会有这个问题.

目前唯一的考量是 可以做一个保护. 但这个保护是有代价的, 即 在超出某个阈值后 主动丢弃新写入的日志, 保证log4z占用的内存小于一个阈值.

目前没有收到更多的关于这个问题的反馈, 我自己几个项目的使用也不存在这些问题 最近想节省出一些时间LOL .

@molixiaoge
Copy link
Author

好的,明白了.
如果量不是很大的情况下,这个问题是不存在的.(出现问题的原因,还是生产者消费者不平衡)
但是我觉得这种模式始终会有问题,算法始终要考虑一些极端的情况,
我个人认为如果超过阈值就启用及时写入来清理占用的内存.

@zsummer
Copy link
Owner

zsummer commented Nov 6, 2016

即时写入并不能解决这个问题, log4z的写入检查间隔是50ms(休眠), 但进入下次休眠的前提是写空日志队列.
问题的表现是 log4z已经来不及去休眠 持续写入硬盘的情况下仍然不能写空日志队列,并且日志队列的数据还在随着push超额增加. 和休眠没有任何关系.
问题的原因是 日志量超过了硬盘写入负荷.
之所以造成日志量超过硬盘写入负荷的原因,以及对应的解决方案是使用者的问题, log4z这里能做到的 是提供一个宏定义控制的, 在通常情况下一个相对小的问题来替换掉这个问题 即 超出硬盘负荷后丢弃后续日志, 以丢弃超出阈值后的日志为代价保证程序不因日志写入问题造成内存使用殆尽.

在8.25号的更新中 添加了一个宏定义 默认阈值是队列size < 10000 , 也就是说日志队列极端情况下最多占用约80M内存.
commit: 16c209c

@zsummer zsummer closed this as completed Nov 12, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants