环境信息
- EMQX 版本:5.0.8
- 操作系统及版本:docker
- 其他
问题描述
我在看有关日志配置的文档 console_handler,在这个文档中有一句话:日志处理进程将日志事件打印到 EMQX 控制台。
对于这句话,我有两个问题:
- 日志事件是什么意思?
- 启用后会使用独立的进程打印日志,如果不启用是使用 emqx 的进程打印日志?
另外一个问题就是 log_overload_kill,只有启用了日志处理进程才生效?
我的天啊,越看问题越多,是因我能力太差了吗?
console_handler 中的 sync_mode_qlen 属性,默认值是 100,小于 100 是用异步,假设 现在是 20 那么是使用几个线程异步呢?
sync_mode_qlen 属性和 log_overload_kill 的 qlen 属性,应该怎么配合?
日志是排查重要途径之一,生产环境要抬高日志级别,否则大量日志的产生会影响性能
不启用出现问题时,不好追踪问题出现的原因。
- 日志事件是什么意思? 就是需要记录日志的时候
- 启用后会使用独立的进程打印日志,如果不启用是使用 emqx 的进程打印日志?
独立进程是说emqx进程里会启动erlang的独立进程(相当于操作系统的线程来做),总的来说,还是emqx的进程在打印日志的。
另外一个问题就是 log_overload_kill,只有启用了日志处理进程才生效?
没出现问题,就不要调他就行了。
谢谢你,
但是这个问题呢?
console_handler 中的 sync_mode_qlen 属性,默认值是 100,小于 100 是用异步,假设 现在是 20 那么是使用几个线程异步呢?
在emqx内部所有的线程都可以需要/也有权限记录日志。
记录日志分2步:
- A线程把日志内容在本线程内做好序列化成二进制
- 线程再二进制传给落盘的线程(每一个handler都是一个落盘线程。)
当落盘线程还缓存着小于sync_mode_qlen 个二进制没有存到磁盘时,A线程直接异步把二进制传给它就去忙自己的事了。如果大于了,则是同步模式,要=落磁盘成功。这样可以防止落盘线程压力过大,内存OOM掉。
好难理解啊,落盘线程就是之前说的独立进程吗?
就是说 A 线程传递给落盘线程的时候,会先判断落盘线程有没有超过 sync_mode_qlen ,超过了后就会一直等待,直到 落盘程序的缓存低于 sync_mode_qlen 的时候,A 线程再异步传递给落盘线程?
但是这里又有一个问题,假设落盘程序的缓存已经满了,这个时候 A 线程要先进行了等待,然后 B 线程再在进行了等待,那么当落盘程序的缓存减少了,那么是 A 线程先发送给落盘程序,还是 B 线程先发送,就是说,这两个是有顺序的还是无序的?
还有就是你说的 A 线程,可以理解成一个客户端吗?
抱歉,我是第一次使用 EMQX,所以有些地方不理解,导致问题有点多。