Я только что прочитал книгу Оптимизация Java от Oreilly, чтобы попытаться улучшить производительность моего приложения на медленном устройстве с «черным ящиком» с одним процессором.
Одной из рекомендаций было использование vmstat -1
и отслеживание, если имеется слишком большое количество переключателей контекста , но это не дает никаких указаний на то, что будет чрезмерным
Вывод команды linux vmstat 1
, когда мое приложение не запущено
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 1756780 29760 273460 0 0 0 0 110 139 18 2 80 0 0
2 0 0 1756732 29760 273464 0 0 0 0 111 144 21 2 78 0 0
0 0 0 1756780 29760 273464 0 0 0 0 120 250 29 14 57 0 0
0 0 0 1756780 29760 273464 0 0 0 0 110 134 16 5 79 0 0
2 0 0 1756732 29760 273468 0 0 0 0 113 147 21 1 78 0 0
0 0 0 1756780 29760 273464 0 0 0 0 116 203 19 13 68 0 0
0 0 0 1756780 29760 273464 0 0 0 0 122 136 18 2 80 0 0
2 0 0 1756732 29760 273468 0 0 0 0 114 145 17 6 77 0 0
0 0 0 1756780 29760 273464 0 0 0 0 121 205 23 10 67 0 0
0 0 0 1756780 29760 273464 0 0 0 0 117 138 17 3 79 0 0
2 0 0 1756740 29760 273456 0 0 0 0 112 152 19 5 76 0 0
Вывод, когда приложение запущено, но не нужно выполнять никаких действий
r b swpd free buff cache si so bi bo in cs us sy id wa st
1 0 0 1510320 29760 273660 0 0 0 0 162 308 26 9 65 0 0
0 0 0 1510320 29760 273660 0 0 0 1268 167 238 18 3 79 0 0
0 0 0 1510336 29760 273628 0 0 0 0 156 282 21 9 70 0 0
0 0 0 1510336 29760 273628 0 0 0 0 161 298 23 13 64 0 0
0 0 0 1510336 29760 273628 0 0 0 0 154 223 18 3 79 0 0
0 0 0 1510336 29760 273628 0 0 0 0 159 227 19 2 79 0 0
0 0 0 1510336 29760 273616 0 0 0 36 172 319 27 9 64 0 0
0 0 0 1510336 29760 273616 0 0 0 0 157 222 19 2 79 0 0
0 0 0 1510336 29760 273616 0 0 0 0 156 224 20 1 79 0 0
0 0 0 1510336 29760 273616 0 0 0 0 162 299 28 8 65 0 0
0 0 0 1510336 29760 273608 0 0 0 0 162 229 18 3 79 0 0
0 0 0 1510336 29760 273612 0 0 0 12 160 234 18 3 79 0 0
0 0 0 1510336 29760 273608 0 0 0 0 167 362 28 18 54 0 0
0 0 0 1510336 29760 273608 0 0 0 0 157 219 20 1 79 0 0
0 0 0 1510336 29760 273608 0 0 0 0 159 224 20 2 79 0 0
0 0 0 1510336 29760 273608 0 0 0 0 165 324 24 13 63 0 0
0 0 0 1510336 29760 273608 0 0 0 4 160 231 19 2 79 0 0
0 0 0 1510336 29760 273608 0 0 0 0 154 223 16 5 79 0 0
0 0 0 1510336 29760 273600 0 0 0 0 161 301 21 15 64 0 0
0 0 0 1510336 29760 273600 0 0 0 0 154 219 17 4 79 0 0
0 0 0 1510336 29760 273600 0 0 0 0 157 229 19 2 79 0 0
0 0 0 1510336 29760 273604 0 0 0 208 164 306 25 10 64 0 0
вывод, когда приложение занято и работает на максимальной мощности
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
6 1 0 1680244 29756 176972 0 0 744 0 206 382 84 16 0 0 0
5 0 0 1679252 29756 178156 0 0 652 1408 495 382 93 7 0 0 0
6 0 0 1677756 29756 178964 0 0 668 0 515 402 97 3 0 0 0
6 0 0 1676516 29756 179472 0 0 500 0 181 402 87 13 0 0 0
4 0 0 1675772 29756 180012 0 0 504 0 188 438 98 2 0 0 0
5 0 0 1675036 29756 180604 0 0 0 0 320 351 96 4 0 0 0
10 0 0 1671308 29756 180676 0 0 0 2040 360 374 82 18 0 0 0
4 0 0 1671308 29756 180804 0 0 0 0 179 397 88 12 0 0 0
5 0 0 1671308 29756 181084 0 0 0 0 183 337 97 3 0 0 0
4 0 0 1670688 29756 181544 0 0 0 0 182 385 84 16 0 0 0
6 0 0 1670192 29756 182296 0 0 0 0 175 424 97 3 0 0 0
4 0 0 1669308 29756 183132 0 0 0 1688 307 406 96 4 0 0 0
4 0 0 1668936 29756 183216 0 0 0 0 218 418 87 13 0 0 0
5 0 0 1664968 29756 183748 0 0 32 0 173 325 94 6 0 0 0
4 0 0 1663852 29756 184768 0 0 520 0 200 434 97 3 0 0 0
5 0 0 1662364 29756 185976 0 0 436 0 192 421 88 12 0 0 0
5 0 0 1662240 29756 186416 0 0 176 3240 220 402 96 4 0 0 0
5 0 0 1661744 29756 186680 0 0 0 8 635 371 91 9 0 0 0
6 0 0 1661628 29756 186668 0 0 0 100 327 451 84 16 0 0 0
4 0 0 1661636 29756 186684 0 0 0 0 184 397 100 0 0 0 0
7 0 0 1658660 29756 186804 0 0 0 0 406 351 91 9 0 0 0
6 0 0 1657916 29756 187160 0 0 348 472 228 410 87 13 0 0 0
Похоже, что CS составляет от 100 до 200 без моего приложения, 200 - 300, когда занят, но не работает, и 300-400, когда занят. Для меня это увеличение представляется целесообразным, но это не основано на многих. Число запущенных процессов (r) увеличивается, когда они заняты, я предполагаю, что это сопоставляется с потоками Java, удивляясь, что больше нет заблокированных потоков (b), поскольку в Интернете достаточно много операций ввода-вывода
Внутри приложения количество рабочих потоков ограничено 3 на одном процессоре, потому что я предполагаю, что наличие большего количества увеличило бы просто переключение контекста, а просто наличие 1 означало бы сидеть слишком долго, ожидая ввода-вывода и не используя процессор .Чтобы
Когда скорость процессора составляет от 82% до 100%. Опять же, мне это кажется довольно хорошим, но в книге есть предупреждение, что это может быть вызвано чрезмерной сборкой мусора (однако параметры ведения журнала сбора мусора, похоже, не работают с Java 9 jvm, который я использую)
Настройка производительности на этом уровне является новой для меня, любая интерпретация результатов будет интересна