ATS线上报告个别日志过大无法写入问题的解决方法
訪問(wèn)日志是分析CDN線上問(wèn)題的重要參考依據(jù),但是我們?cè)趯?shí)際運(yùn)維中發(fā)現(xiàn)很多部署點(diǎn)日志記錄出現(xiàn)一些小問(wèn)題,會(huì)造成相應(yīng)的日志條目丟失。我們發(fā)現(xiàn)線上一些服務(wù)器上時(shí)常會(huì)報(bào)告如下問(wèn)題:
diags.log中經(jīng)常報(bào)如下錯(cuò)誤:
[Mar 31 02:39:34.185] Server {0x2b1d85563700} NOTE: <LogObject.cc:616 (log)> Skipping the current log entry for access.log because its size (9136) exceeds the maximum payload space in a log buffer 分析問(wèn)題 這里已經(jīng)指出了報(bào)錯(cuò)日志的代碼位置在LogObject.cc:616,導(dǎo)致出錯(cuò)的函數(shù)位置的源碼是顯然我們需要研究 _checkout_write()函數(shù)的實(shí)現(xiàn),并關(guān)注返回為NULL的值,里面實(shí)際上是調(diào)用 result_code = buffer->checkout_write(write_offset, bytes_needed); 來(lái)控制多線程同步寫(xiě)日志,
上述日志信息所走的流程是
它是result_code的返回碼LogBuffer::LB_BUFFER_TOO_SMALL,所以最終我們還得查看LogBuffer::checkout_write()返回該狀態(tài)碼的地方,注意如下函數(shù)的返回值 LB_ResultCode ret_val = LB_BUSY; 返回的該代碼是
上面的比較,m_size的值很關(guān)鍵,我們需要關(guān)注m_size的默認(rèn)賦值是多少?這是寫(xiě)日志的一個(gè)初始緩存的長(zhǎng)度,字符串型的,在LogBuffer.cc中
它是調(diào)用它的構(gòu)造函數(shù)生成的 LogBuffer(LogObject * owner, size_t size, ?size_t buf_align = LB_DEFAULT_ALIGN, size_t write_align = INK_MIN_ALIGN);
可以看出分配指定長(zhǎng)度的緩存給m_unaligned_buffer,并將它對(duì)齊為m_buffer,動(dòng)態(tài)釋放內(nèi)存的地方在析構(gòu)函數(shù)中
建議gdb追蹤來(lái)找到調(diào)用點(diǎn),發(fā)現(xiàn)還是在LogObject.cc中有幾處地方,都有如下代碼 LogBuffer *b = NEW (new LogBuffer (this,?Log::config->log_buffer_size)); 現(xiàn)在繼續(xù)追蹤Log的配置項(xiàng),在sourceInsight中搜索log_buffer_size得到
結(jié)果很清楚了,配置項(xiàng)配大點(diǎn)就可以了。 解決方法 在records.config中添加一項(xiàng)proxy.config.log.log_buffer_size,配置大些就可以了。直接熱修改如下: traffic_line -r proxy.config.log.log_buffer_size traffic_line -s?proxy.config.log.log_buffer_size -v 40960 traffic_line -x 如果還是報(bào)類(lèi)似上面的錯(cuò)誤,可以繼續(xù)酌情修改這個(gè)值,總之,要根據(jù)業(yè)務(wù)的實(shí)際情況修改
更進(jìn)一步修正
修改上述配置后,發(fā)現(xiàn)線上日志出現(xiàn)如下報(bào)錯(cuò)
經(jīng)過(guò)查看,發(fā)現(xiàn)與另一個(gè)配置proxy.config.log.max_line_size有關(guān),它的默認(rèn)值也是9216
解決方法:
在records.config中添加一條配置(可根據(jù)實(shí)際情況酌情修改)
CONFIG proxy.config.log.max_line_size INT 15000
下面是修改前后的判決圖
下面是源碼追蹤流程,不愿深究的可以略去。
調(diào)用流程追蹤
報(bào)錯(cuò)地方的源碼是
在source insight中追蹤源碼中的max_line_size可以看到基本調(diào)用流程。
剩下的是配置項(xiàng)的讀取
總結(jié):最終一個(gè)通用的設(shè)置,在records.config中加入:
CONFIG proxy.config.log.max_line_size INT 35000 CONFIG proxy.config.log.log_buffer_size INT 262144總結(jié)
以上是生活随笔為你收集整理的ATS线上报告个别日志过大无法写入问题的解决方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 解密ATS 4.2.3的缓存状态密码
- 下一篇: 在Ubuntu 14.04 64bit上