Мониторинг Java-приложений (4) — онлайн-процедуры устранения неполадок

Java

tags: java, troubleshooting, monitor


Обобщенно в одном предложении: Как устранять такие проблемы, как высокая загрузка ЦП, переполнение памяти и высокая скорость ввода-вывода в java-приложении онлайн, подробно расскажет эта статья.

1. Введение

После запуска java-приложения неизбежно возникнут различные проблемы, которые в целом можно разделить на четыре категории:

  • (1) Проблемы, связанные с ЦП
  • (2) Проблемы с памятью
  • (3) Проблемы, связанные с диском и вводом-выводом
  • (4) Проблема с бизнес-кодом.

В ответ на эти проблемы, как отслеживать и устранять неполадки в Интернете, является необходимым навыком для разработчика Java. Далее будут описаны процедуры устранения неполадок для этих проблем в сочетании с упомянутыми выше инструментами командной строки Java.

2 Процедуры устранения неполадок процессора

Если обнаруживается, что система работает медленно, а отклик приложения становится медленным, первое, что нужно проверить, — это загрузка ЦП.Как правило, процесс занимает слишком много ЦП, поэтому необходимо отслеживать загрузку ЦП.В Java-приложениях ЦП в основном связан с потоками.Запуск, поэтому специфичный для java-приложений, вам необходимо отслеживать статус выполнения потока, что соответствует инструменту командной строкиjstack. Поэтому, чтобы обобщить проблему высокой загрузки ЦП, можно выполнить следующие процедуры:

# (1) 查询CPU占用高的进程ID(PID)
top -c

# (2) 了解此进程的启动参数
ps -ef|grep  PID
或者
jinfo -flags PID

# (3) 打印线程堆栈信息并输出文件
jstack -l PID > PID.dump

# (4) 根据进程查找线程ID(TID)
top -H -p PID

# (5) 获取TID的16进制数
printf "%x\n" TID

# (6) 结合TID和线程堆栈信息文件查找问题
- 可以使用文本工具直接查看
- 可以使用 grep TID -A20 PID.dump 来查看
- 需要配合线程状态来检查

оjstackИнструменты и статус потока можно найти в статье "Мониторинг приложений Java (3) - освоили ли вы эти инструменты командной строки"

3 Процедуры устранения неполадок с памятью

Основная проблема с памятью заключается в том, что OOM (недостаточно памяти) возникает во время процесса выполнения java-приложения, поэтому рекомендуется добавлять несколько параметров при запуске java-приложения, в том числе-Xloggc:file -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=logs/heapdump.hprof -XX:ErrorFile=logs/java_error_%p.log. Таким образом, когда происходит oom, причина oom может быть проанализирована из файла дампа. Инструменты командной строки Java, связанные с проблемами памяти, включаютjmap,jstat, поэтому процедура устранения неполадок памяти OOM выглядит следующим образом:

# (1)找到java应用进程(PID)
jps -lvm
或者
top -c

# (2)了解此进程启动参数(特别是-Xms,-Xmx等)
ps -ef|grep  PID
或者
jinfo -flags PID

# (3) 确认内存情况
jmap -heap PID

# (4) 查找占内存的大对象
jmap -histo:live PID 

# (5) dump出堆文件,以便使用工具分析
jmap -dump:file=./heap.hprof PID

# (6) 查看GC变化情况,如下每秒打印一次
jstat -gc PID 1000 

# (7) 结合日志文件出错信息及dump出来的堆文件分析OOM和GC情况
- 内存分配小,适当调整内存
- 对象被频繁创建,且不释放,优化代码
- young gc频率太高,查看-Xmn、-XX:SurvivorRatio等参数设置是否合理

О ООМ,официальная документацияЕсть примечание про ООМ(https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/memleaks002.html), В основном делятся на следующие категории:

  • java.lang.OutOfMemoryError: Java heap space, использование памяти в куче достигло-XmxМаксимальное значение настройки, нельзя создавать новые объекты, просто рассмотреть настройку-Xmxпараметры для решения.
  • java.lang.OutOfMemoryError: GC Overhead limit exceededПредставление GC было выполнено, и процесс Java работает очень медленно, обычно брошено, выделение пространства кучи Java не может быть настолько маленьким, что новые данные в кучу. Рассмотрите возможность регулировки размера кучи, если вы хотите закрыть параметры выходных данных, можно использовать для выключения-XX:-UseGCOverheadLimit.
  • java.lang.OutOfMemoryError: Requested array size exceeds VM limit, приложение Java пытается выделить массив, превышающий размер кучи. Например, если размер кучи равен 256 М, но выделен массив размером 512 МБ, будет сообщено об ошибке. Рассмотрите возможность настройки размера кучи или изменения кода
  • java.lang.OutOfMemoryError: Metaspace, когда объем собственной памяти, необходимой для метаданных класса, превышает MaxMetaSpaceSize, об этом будет сообщено.Рассмотрите возможность настройки MaxMetaSpaceSize.
  • java.lang.OutOfMemoryError: request size bytes for reason. Out of swap space?Об этой ошибке сообщается, когда происходит сбой выделения из собственной кучи, а собственная куча может быть близка к исчерпанию и требует просмотра в журналах для обработки.
  • java.lang.OutOfMemoryError: Compressed class space, в структуре JVM без кучи места для хранения указателя класса недостаточно, рассмотрите возможность использованияCompressedClassSpaceSizeнастроить.
  • java.lang.OutOfMemoryError: reason stack_trace_with_native_method, область локальных методов JVM недостаточна, и в собственном интерфейсе Java (JNI) или собственном методе обнаружен сбой выделения, и необходимо запросить соответствующую информацию о стеке.

4 Процедуры устранения неполадок с диском и вводом-выводом

Во время выполнения Java-приложения могут быть задействованы такие операции, как генерация журнала, чтение и запись на диск, а также могут возникнуть различные проблемы, такие как нехватка места на диске (слишком большой вывод журнала), медленное чтение и запись на диск и чрезмерные ИО. Вообще говоря, вы можете проверить в соответствии со следующими процедурами:

# (1) 查看磁盘容量情况
df -h

# (2) 查看文件大小和目录大小
ls -l 或者直接ll
du -h --max-depth=1

# (3) 查看IO情况,找到IO读写频繁的进程PID
iotop -d 1 # 1秒打印一次
或者
iostat -d -x -k 1 #1秒打印一次

# (4) 使用stack打印线程堆栈信息,排查IO相关代码

# (5) 有时候若想测试磁盘的读写速度(特别是虚拟机),可以使用dd
# 示例:测数据卷挂载目录的纯写速度
dd if=/dev/zero of=/数据卷目录/test.iso bs=8k count=1000000

5 способов устранения неполадок в бизнесе

Бизнес-проблемы в основном связаны с логическим уровнем кода, в основном с запросом вывода журнала, выполняется ли метод в соответствии с правильной логикой, поэтому общая процедура устранения неполадок выглядит следующим образом:

# (1) 实时日志输出查询
tail -fn 100 log_file

# (2) 根据日志输出的关键字来定位问题
grep keyWord log_file # 关键字所在行
grep -C n keyWord log_file # 关键字所在前后n行

# (3) 日志文件使用可视化文本工具分析(notepad++,sublime,大文件查看如EmEditor)

# (4) 使用线上工具直接检测方法的参数、返回值,异常情况等等,如Btrace,arthas等。

Средства диагностики онлайн-проблем Java включают Btrace и arthas, которые будут представлены в следующих статьях этой серии.

6 Резюме

В этой статье проблемы, встречающиеся в приложении Java в Интернете, разделены на четыре категории, а именно (1) проблемы, связанные с процессорами, (2) проблемы, связанные с памятью, (3) проблемы, связанные с IO, и (4) бизнес Кодовые проблемы. Для различных проблем, в соответствии с определенными процедурами, в сочетании с инструментами командной строки Java и онлайн-диагностики, вы можете легко устранить неполадки приложений Java. Надеюсь, что эта статья полезна для соответствующих разработчиков Java.

использованная литература

Связанное Чтение