Сводка по оптимизации системы — системный уровень

Java Архитектура JVM сервер Linux

Сводка по оптимизации системы

Раньше большой парень в группе поделился кое-какой ерундой об оптимизации производительности системы, здесь я организую это в документ и добавлю некоторые инструменты и методы, которые я обычно использую. Поскольку по оптимизации производительности системы связано много контента, я поделюсь им в нескольких статьях. Поделитесь этим временем定位系统层面问题Общие методы.

Определение производительности системы

  • На протяжении всей пропускной способности (количество запросов, которые система может обработать в секунду)
  • Задержка (задержка обработки запроса системой)
  • Использование Использование ресурсов

Пропускная способность и задержка

  • Чем выше пропускная способность, тем выше будет задержка. Поскольку объем запросов слишком велик, а система слишком занята, время ответа уменьшится.
  • Чем ниже задержка, тем выше пропускная способность, которую можно поддерживать. Поскольку короткие задержки означают более быструю обработку, можно обработать больше запросов.
  • 异步化可以提高系统的吞吐量的灵活性,但是不会获得更快的响应时间。

Общие инструменты для стресс-тестирования производительности системы

tcpdump

1. Общие параметры:

-i:指定需要的网
-s:抓取数据包时默认抓取长度为68字节,加上-s 0后可以抓到完整的数据包
-w:监听的数据包写入指定的文件

2. Пример

tcpdump -i eth1 host 10.1.1.1  // 抓取所有经过eth1,目的或源地址是10.1.1.1的网络数据包 

tcpdump -i eth1 src host 10.1.1.1  // 源地址

tcpdump -i eth1 dst host 10.1.1.1  // 目的地址

Если вы хотите использовать wireshark для анализа пакетов tcpdump, вам нужно добавить параметр -s:

tcpdump -i eth0 tcp and port 80 -s 0 -w traffic.pcap

tcpcopy — стресс-тест дренажа в Интернете

tcpcopy — это инструмент копирования запросов для воспроизведения в режиме реального времени и в автономном режиме.Он может копировать онлайн-трафик на тестовую машину, моделировать реальную онлайн-среду в реальном времени и тестировать реальный онлайн-трафик без подключения программы к сети. Обязательный инструмент для реальных боевых учений.

а. tcpdump записывает файл темпа

tcpdump -i eth0 -w online.pcap tcp and port 80

б. Воспроизведение трафика

tcpcopy -x 80-10.1.x.x:80 -i traffic.pcap
	
tcpcopy -x 80-10.1.x.x:80 -a 2 -i traffic.pcap  // 离线回放加速2倍

в. Режим дренажа

tcpcopy -x 80-10.1.x.x:80 -r 20  // 20%引流
	
tcpcopy -x 80-10.1.x.x:80 -n 3  // 放大三倍引流

wrk & ApacheBench & Jmeter & webbench

Лично я настоятельно рекомендую wrk.Он легкий и дает точные результаты испытаний под давлением.В сочетании со сценариями Lua он может поддерживать более сложные сценарии испытаний.

Пример стресс-теста: 4 потока используются для имитации 1000 одновременных соединений, весь тест длится 30 секунд, время ожидания соединения составляет 30 секунд, и выводится запрошенная статистика задержки.

> wrk -t4 -c1000 -d30s -T30s --latency http://www.baidu.com

Running 30s test @ http://www.baidu.com
  4 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.71s     3.19s   26.51s    89.38%
    Req/Sec    15.83     10.59    60.00     66.32%
  Latency Distribution
     50%  434.52ms
     75%    1.70s
     90%    5.66s
     99%   14.38s
  1572 requests in 30.09s, 26.36MB read
Requests/sec:     52.24
Transfer/sec:      0.88MB

Дополнительная справочная информация о параметрах:

> wrk --help

Usage: wrk <options> <url>
  Options:
    -c, --connections <N>  Connections to keep open
    -d, --duration    <T>  Duration of test
    -t, --threads     <N>  Number of threads to use

    -s, --script      <S>  Load Lua script file
    -H, --header      <H>  Add header to request
        --latency          Print latency statistics
        --timeout     <T>  Socket/request timeout
    -v, --version          Print version details

  Numeric arguments may include a SI unit (1k, 1M, 1G)
  Time arguments may include a time unit (2s, 2m, 2h)

Выявление узких мест в производительности

Производительность системы можно измерить по следующим аспектам:

  • Уровень приложения
  • системный уровень
  • Уровень JVM
  • Profiler

Уровень приложения

Показатели производительности на уровне приложения:

  • QPS
  • Время отклика, 95, 99 строк и т.д.
  • Степень успеха

системный уровень

Индикаторы системного уровня включают ЦП, память, диск, сеть и т. д. Рекомендуется использовать команду Sharp для запроса производительности системы:

dstat -lcdngy

dstat очень мощный и может отслеживать использование процессора, диска, сети, ввода-вывода, памяти и т. д. в режиме реального времени.

  • способ установки

yum install -y dstat

  • Описание функции
-c:显示CPU系统占用,用户占用,空闲,等待,中断,软件中断等信息。
-C:当有多个CPU时候,此参数可按需分别显示cpu状态,例:-C 0,1 是显示cpu0和cpu1的信息。 
-d:显示磁盘读写数据大小。 -D hda,total:include hda and total。 
-n:显示网络状态。 -N eth1,total:有多块网卡时,指定要显示的网卡。 
-l:显示系统负载情况。 
-m:显示内存使用情况。 
-g:显示页面使用情况。 
-p:显示进程状态。 
-s:显示交换分区使用情况。 
-S:类似D/N。 
-r:I/O请求情况。 
-y:系统状态。 
--ipc:显示ipc消息队列,信号等信息。 
--socket:用来显示tcp udp端口状态。 
-a:此为默认选项,等同于-cdngy。 
-v:等同于 -pmgdsc -D total。 
--output 文件:此选项也比较有用,可以把状态信息以csv的格式重定向到指定的文件中,以便日后查看。例:dstat --output /root/dstat.csv & 此时让程序默默的在后台运行并把结果输出到/root/dstat.csv文件中。	

Cpu

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

    CPU利用率 = 1 - 程序占用cpu时间/程序总的运行时间

  • Время пользователя/время ядра: примерно определите, является ли приложение интенсивным с точки зрения вычислений или ввода-вывода.

    Время, которое ЦП проводит в коде пользовательского режима, называется временем пользователя, а время, которое ЦП тратит на выполнение кода режима ядра, называется временем ядра. Время ядра в основном включает время системных вызовов, потоков ядра и прерываний. При общесистемном измерении отношение времени пользователя к времени ядра показывает тип выполняемой нагрузки. Приложения с интенсивными вычислениями проводят много времени в коде пользовательского режима, а соотношение времени пользователя и времени ядра близко к 99/1. Примерами этого являются обработка изображений, анализ данных и т. д. Приложения с интенсивным вводом-выводом имеют высокую частоту системных вызовов и выполняют операции ввода-вывода, выполняя код ядра. Веб-сервер, выполняющий сетевой ввод-вывод, имеет соотношение времени пользователя и ядра примерно 70/30.

  • load: среднее количество процессов в очереди выполнения в течение определенного интервала времени. Каждый ЦП имеет очередь выполнения, в которой хранятся потоки, готовые и ожидающие выполнения ЦП.理想状态下,希望负载平均值小于等于Cpu核数。

Разница между использованием ЦП и нагрузкой:

  • Средняя загрузка используется для измерения тенденции использования ЦП, а не ситуации в определенный момент времени.
  • Средняя загрузка включает спрос на все ЦП, а не только на те, которые были активны во время измерения.

диск

Место на диске: Отсутствие места приведет к тому, что программа не запустится или сообщит об ошибке.

du -sh //查看当前文件夹下所有文件大小

df -hl //以磁盘分区为单位查看文件系统

Иногда файл системного журнала сервера Linux слишком велик, а использование диска слишком велико.Рекомендуются два метода очистки:

sudo /dev/null > /var/log/**.log  //删除指定的较大日志文件,速度快
sudo find /var/log/ -type f -mtime +30 -exec rm -f {} \  //删除30天之前的日志文件

Разрешения на доступ к диску: отсутствие разрешений приведет к тому, что программа не запустится или сообщит об ошибке.

ll /yourdir

Тест производительности диска

dd if=/dev/zero of=output.file bs=10M count=1

пропускная способность ввода-вывода, iowait

Сосредоточьтесь на этих двух факторах: большое количество операций чтения и записи с диска и высокий iowait часто означают, что диск может быть узким местом. На самом деле, iowait не отражает, что диск является узким местом в производительности, он фактически измеряет время процессора:

%iowait = (cpu idle time)/(all cpu time)

так唯一定位磁盘成为性能瓶颈的直接方法还是看read/write时间. Ниже мы сосредоточимся на том, как найти проблему ввода-вывода.

А. Макроскопически определите, является ли это проблемой ввода-вывода: верхняя команда, вы можете увидеть процент ЦП, потраченный впустую на ожидание ввода-вывода из строки ЦП; чем выше значение, тем больше ресурсов ЦП ожидает разрешений ввода-вывода.

б. Определите конкретные проблемы с диском: iostat

%util интуитивно показывает, на какой диск выполняется запись и насколько занято устройство. Запросы на чтение и запись в миллисекунду (rrqm/s wrqm/s) и количество операций чтения и записи в секунду (r/s w/s) также предоставляют много полезной информации для устранения неполадок.

в) Определите конкретный процесс: простой и грубый iotop интуитивно показывает, какой процесс является виновником проблемы ввода-вывода.

г. ps оценивает, является ли процесс таким же мощным, как ожидание ввода-вывода

Как мы все знаем, команда ps предоставляет нам такую ​​информацию, как память, процессор и состояние процесса.По состоянию процесса легко найти информацию о процессе, ожидающем ввода-вывода.

Вот краткое описание нескольких состояний процесса Linux:

  • R (TASK_RUNNING), исполняемое состояние.
  • S (TASK_INTERRUPTIBLE), прерываемое состояние сна.
  • D (TASK_UNINTERRUPTIBLE), состояние непрерывного сна.
  • T (TASK_STOPPED или TASK_TRACED), состояние паузы или состояние трассировки.
  • Z (TASK_DEAD – EXIT_ZOMBIE), статус выхода, процесс становится зомби-процессом.
  • X (TASK_DEAD — EXIT_DEAD), статус выхода, процесс вот-вот будет уничтожен.

Состояние процесса, ожидающего ввода-вывода, обычно представляет собой «непрерывный сон», то есть состояние D.D状态以及R状态进程算为运行队列之中, поэтому слишком много процессов в состоянии D также приведет к высокой нагрузке на систему.Если вам интересно, вы можете увидеть принцип расчета нагрузки Linux.

Просмотрите процесс состояния D:

> for x in `seq 1 1 10`; do ps -eo state,pid,cmd | grep "^D"; echo "--------"; sleep 5; done

D 13389 /usr/libexec/gcc/x86_64-redhat-linux/4.4.7/cc1 -quiet -I../../include/cat -I../ -I. -dD message_sender.c -quiet -dumpbase message_sender.c -mtune=generic -auxbase message_sender -ggdb3 -O2 -O0 -o /tmp/ccivsNPE.s

Получите информацию, связанную с io, в соответствии с псевдофайловой системой proc:

> cat /proc/pid/io

rchar: 548875497
wchar: 270446556
syscr: 452342
syscw: 143986
read_bytes: 253100032
write_bytes: 24645632
cancelled_write_bytes: 3801088

д. Определите, какой файл часто читается и записывается: lsof -p pid

Интернет

1. nestat

netstat -nt Просмотр состояния подключения, связанного с TCP, количества подключений, а также очередей отправки и получения.

Что касается состояния tcp, вы должны быть знакомы с процессом трехстороннего рукопожатия и четырехсторонней волны Здесь все состояния tcp перечислены первыми.

客户端:SYN_SENT、FIN_WAIT1、FIN_WAIT2、CLOSING、TIME_WAIT

服务端:LISTEN、SYN_RCVD、CLOSE_WAIT、LAST_ACK

Common:ESTABLISHED、CLOSED

Диаграмма изменения состояния TCP (взято из сети):

Несколько замечаний о статусе tcp:

  • Нормальное соединение должно быть в состоянии ESTABLISHED.Если имеется большое количество соединений SYN_SENT, нужно смотреть правила брандмауэра.
  • 如果Recv-Q或者Send-Q持续有大量包存在,意味着连接存在瓶颈或者程序存在bug。
2. Некоторые другие распространенные методы

В netstat есть много полезных навыков, вот наиболее часто используемые:

netstat -nap | grep port 显示使用该端口的所有进程id
    
netstat -nat |awk '{print $6}'|sort|uniq -c|sort -rn 查询全部状态并排序
    
awk '{print $1}' access.log |sort|uniq -c|sort -nr|head -10 分析access.log获取访问做多的top n的ip地址
    
netstat -nat | grep "10.1.1.1:8080" |awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -20 连接某服务器最多的top n的ip地址
    
netstat -s 如果重传的包持续增加,那么很大可能网卡存在问题

JVM

Убийственный инструмент для обнаружения проблемы — стек потоков

1. Шаги для получения стека потоков:
ps -ef | grep java
sudo -u nobody jstack <pid> > /tmp/jstack.<pid>

小技巧:jstack信息是某个时刻的堆栈信息,有时间仅仅一个jstack并不能分析出问题所在,可以适当多几次jstack,然后进行对比分析。

2. Как найти id, соответствующий локальному потоку, из стека потоков

nid = собственный идентификатор потока, особенностью которого является то, что nid использует шестнадцатеричную идентификацию, а идентификатор локального потока является десятичной идентификацией, поэтому эти два могут быть сопоставлены путем десятичного преобразования.

Обмен между шестнадцатеричным и десятичным:

printf %d 0x1b40
printf "0x%x" 6976
3. Методы анализа высокой загрузки ЦП

А. Найдите соответствующий идентификатор процесса Java:

ps -ef | grep java

б) Найдите поток, потребляющий больше всего ресурсов ЦП в процессе Java:

top -H -p <pid>
  • Преобразование найденного идентификатора потока в шестнадцатеричный формат
  • jstack получает стек потоков Java
  • Найдите соответствующую информацию о стеке из стека потоков в соответствии с шестнадцатеричным идентификатором.

说明:线程堆栈中可以看出对应线程执行的是Java代码还是Native method

Не можете найти соответствующий стек потоков?

  • Выполняемый метод Native — это воссозданный поток.
  • Ошибки кода, память кучи исчерпана, а jvm продолжает выполнять полный сборщик мусора.
  • Ошибка самой JVM😂.

Статистика сборки мусора — см. причины Gc

jstat -gccause используется для просмотра статистики сборки мусора.Если сборка мусора происходит, она также будет отображать причину последней и текущей сборки мусора.Причин для последней сборки мусора и текущего мусора будет больше, чем -gcutil.Reason для переработки.

jstat -gccause pid 1234

Пожалуйста, укажите источник перепечатки, прошу обратить внимание на мой публичный номер: техническое колесо Япу

亚普的技术轮子