scouter
scouter copied to clipboard
지속적인 Exception 발생
1ms / 2ms 정도되는 서비스들이 굉장히 많이 발생하는 시스템입니다.
서버에서 다음과 같은 로그들이 계속 발생하며, cpu 가 다른 수집서버보다 높은 편입니다. 기존에 설정이 없었을때는 발생하지 않았던것으로 기억합니다.
수집서버 버전 2.20
수집 서버 로그 (반복적 수시 발생) java.lang.ArrayIndexOutOfBoundsException: 4 at scouter.io.DataInputX.toLong(DataInputX.java:173) at scouter.server.db.io.IndexKeyFile.get(IndexKeyFile.scala:96) at scouter.server.db.text.TextPermIndex.get(TextPermIndex.scala:86) at scouter.server.db.TextPermRD$.getString(TextPermRD.scala:34) at scouter.server.db.TextRD$.getString(TextRD.scala:35) at scouter.server.core.app.XLogGroupUtil$.makeGroupHash(XLogGroupUtil.scala:46) at scouter.server.core.app.XLogGroupUtil$.process(XLogGroupUtil.scala:41) at scouter.server.core.XLogCore$.calc(XLogCore.scala:41) at scouter.server.core.XLogCore$$anonfun$2.apply$mcV$sp(XLogCore.scala:60) at scouter.server.util.ThreadScala$$anon$2.run(ThreadScala.scala:27)
수집 대상 설정(일부)
#XLog sampling mode enabled xlog_sampling_enabled=true
#XLog sampling bound millisecond - step1(lowest : range - from 0 to here) xlog_sampling_step1_ms=50
#XLog sampling step1 percentage(%) xlog_sampling_step1_rate_pct=1
#(deprecated) XLog Ignore Time
- for backward compatibility. Use xlog_sampling_xxx options instead
xlog_lower_bound_time_ms=1
xlog_sampling_step1_rate_pct=1 를 2로 변경하면 빈도가 떨어집니다. 데이터의 변환이 올바르지 않은듯합니다.
에러를 유발하는 , IndexKeyFile.scala 의 95라인
if(looping > conf.log_index_traversal_warning_count) { Logger.println("S152", 10, "[warn] too many index deep searching. " + (if (key.length == 7) DataInputX.toLong(key,0) else ....
부분의 log_index_traversal_warning_count 값을 100 -> 1000 으로 변경하여 회피하는 것으로 설정하여 더이상 나지는 않게되었습니다.
해당 설정값이 무엇을 의미하는지요.
CPU 이슈는 .data file 이 커져서 발생하는 문제 확인 , 삭제 후 cpu 감소 확인.
위에 언급한 로그는 경고성 로그입니다. index가 너무 깊어지면 자원 소모량이 많아지게 됩니다. 이 상황을 인지하여 index 사이즈를 늘이거나 하는데 활용하기 위한 참고 정보로 생각하시면 됩니다.
text_service.data 파일이 20G 이상 커지면서 발생하였는데,
hook_service_patterns=com.xxx.proxy.tcpserver.ReactorTcpServer.*, .... 등으로 모두 class 를 등록하였으나,
xlog 에 다음과 같은 service 들이 찍히고 있어 , 최종적으로 text_service.data 파일이 커지는것 아닌가 싶습니다.
service = 00000040HDC.....
service = 00000040KMS.....
이런 것들은 service 가 아닌 , 실제로 통신할때 주고 받은 값들인데, pattern 에도 맞지 않는데 , 왜 xlog 에 찍힐까요