Сводка по оптимизации системы
Раньше большой парень в группе поделился кое-какой ерундой об оптимизации производительности системы, здесь я организую это в документ и добавлю некоторые инструменты и методы, которые я обычно использую. Поскольку по оптимизации производительности системы связано много контента, я поделюсь им в нескольких статьях. Поделитесь этим временем定位系统层面问题
Общие методы.
Определение производительности системы
- На протяжении всей пропускной способности (количество запросов, которые система может обработать в секунду)
- Задержка (задержка обработки запроса системой)
- Использование Использование ресурсов
Пропускная способность и задержка
- Чем выше пропускная способность, тем выше будет задержка. Поскольку объем запросов слишком велик, а система слишком занята, время ответа уменьшится.
- Чем ниже задержка, тем выше пропускная способность, которую можно поддерживать. Поскольку короткие задержки означают более быструю обработку, можно обработать больше запросов.
异步化可以提高系统的吞吐量的灵活性,但是不会获得更快的响应时间。
Общие инструменты для стресс-тестирования производительности системы
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
Пожалуйста, укажите источник перепечатки, прошу обратить внимание на мой публичный номер: техническое колесо Япу