我刚刚读过Oreilly的《 优化Java 》一书,试图提高在慢速单CPU黑盒设备上应用程序的性能。
一个建议是使用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线程相对应,这是因为没有足够的Internet I / O,令人惊讶的是没有更多的阻塞线程(b)
在该应用程序中,单个cpu上的工作线程数限制为3,因为我认为拥有更多线程只会增加上下文切换,而只有1意味着坐太多等待I / O而不会利用cpu到
当CPU利用率在82%和100%之间时。再次对我来说这似乎很好,但是书中警告说这可能是由于垃圾收集过多所致(但是,记录垃圾收集的选项似乎不适用于我使用的Java 9 jvm)>
这个级别的性能调优对我来说是新的,对结果的任何解释都会很有趣