Table of Contents |
---|
Overview
...
For a single user, performance is better in the Eureka environment. However, when scaled to 20 users, there is a performance degradation of approximately 7.8%
- Very high load for the OpenSearch cluster with more than 52 search operations per second. ERROR: "Too Many Requests" observed during the test with 20 users - non-Eureka.
Service CPU utilization was up to 60% 6% for mod-search and 5% for mod-inventory-storage, for all other services CPU did not exceed 4%.
Memory utilization was stable and no memory leaks or OOM issues were observed.
RDS CPU utilization was about up to 6%.
- Open search CPU utilization was up to 100% with 20 user tests.
Recommendations & Jiras
Errors during 20 users - non-Eureka test are due to a very high load for the OpenSearch cluster. For this test we have a throughput of about 55 ops/s and the maximal Elastic Search throughput is 52 search operations (https://repost.aws/knowledge-center/opensearch-resolve-429-error) according to our cluster configurations.
Use the following formula to calculate maximum active threads for search requests:int ((# of available_processors * 3) / 2) + 1.
- For an r6g.2xlarge.search node, you can perform a maximum of 13 search operations:
(8 VCPUs * 3) / 2 + 1 = 13 operations - For an OpenSearch Service cluster with four nodes, you can perform a maximum of 52 search operations:
4 nodes * 13 = 52 operations
To avoid this error, either increase the number of OpenSearch data nodes to 5 or scale the size of the data nodes to a bigger one.
Test Runs
...
mod-search performance is good, maximal Elastic Search throughput is 52 search operations (https://repost.aws/knowledge-center/opensearch-resolve-429-error).
Show total requests processed increase as we increase the number of users concurrently.
...
60 minutes tests
Test# | Test name | results | Comments |
---|---|---|---|
1 | 1 user - non-Eureka | Success | 0 errors |
2 | 20 users - non-Eureka | Completed with errors | 3224 errors out of 199179 API calls ERROR: "Too Many Requests" |
3 | 20 users - non-Eureka |
retest | Completed with errors | 41894 errors out of 252249 API calls ERROR: "Too Many Requests" | |
4 | 1 user - Eureka | Success | 0 errors |
5 | 20 users - Eureka | Success | 0 errors |
Results and Comparison Eureka and non-Eureka
mod-search performance is good, maximal Elastic Search throughput is 52 search operations (https://repost.aws/knowledge-center/opensearch-resolve-429-error).
Show total requests processed increase as we increase the number of users concurrently.
1 user - non-Eureka(avg) | 1 user - Eureka (avg) | % | 20 users - non-Eureka(avg) | 20 users - Eureka (avg) |
---|
% | ||||||
---|---|---|---|---|---|---|
Total requests processed in 60 minutes test run | 19657 | 20811 | 5.9% | 199179 (3224 errors) | 183864 | -7.6% |
Average throughput | 5.44 ops/s | 5.77 ops/s | 6% | 55.2 ops/s | 50.9 ops/s | -7.8% |
Average response time | 194 | 185 | -4.6% | 365 | 382 | 4.7% |
1 user - non-Eureka | 1 user - Eureka | 20 users - non-Eureka | 20 users - Eureka | |||||||
---|---|---|---|---|---|---|---|---|---|---|
transaction | Number Of Samples | Average | Number Of Samples | Average | % | Number Of Samples | Average | Number Of Samples | Average | % |
MSF_GET /search/authorities keyword <> random sentence | 393 | 207 | 416 | 200 | -3.38164 | 3943 | 540 | 3682 | 477 | -11.6667 |
MSF_GET /search/authorities keyword <> randomword | 393 | 202 | 417 | 194 | -3.9604 | 4104 | 516 | 3684 | 462 | -10.4651 |
MSF_GET /search/authorities keyword = *random sentence* | 393 | 1224 | 416 | 1142 | -6.69935 | 3933 | 2120 | 3682 | 1545 | -27.1226 |
MSF_GET /search/authorities keyword = random sentence | 393 | 30 | 416 | 23 | -23.3333 | 3937 | 95 | 3682 | 245 | 157.8947 |
MSF_GET /search/authorities keyword = randomword | 393 | 44 | 417 | 32 | -27.2727 | 4246 | 127 | 3684 | 234 | 84.25197 |
MSF_GET /search/authorities keyword == random sentence | 393 | 29 | 416 | 22 | -24.1379 | 3949 | 92 | 3683 | 225 | 144.5652 |
MSF_GET /search/authorities keyword == randomword | 393 | 43 | 417 | 31 | -27.907 | 4041 | 138 | 3683 | 244 | 76.81159 |
MSF_GET /search/authorities keyword all *randomword* | 393 | 891 | 417 | 821 | -7.85634 | 3997 | 1626 | 3683 | 1191 | -26.7528 |
MSF_GET /search/authorities keyword all random sentence | 393 | 32 | 417 | 25 | -21.875 | 3979 | 104 | 3683 | 243 | 133.6538 |
MSF_GET /search/authorities keyword all randomword | 394 | 67 | 417 | 54 | -19.403 | 5481 | 141 | 3686 | 262 | 85.8156 |
MSF_GET /search/authorities keyword any random sentence | 393 | 99 | 416 | 86 | -13.1313 | 3958 | 226 | 3683 | 272 | 20.35398 |
MSF_GET /search/authorities keyword any randomword | 394 | 55 | 417 | 43 | -21.8182 | 4618 | 129 | 3685 | 232 | 79.84496 |
MSF_GET /search/instances: contributors <> 2random words | 393 | 158 | 416 | 152 | -3.79747 | 3877 | 379 | 3679 | 408 | 7.651715 |
MSF_GET /search/instances: contributors = *randomword | 393 | 198 | 416 | 192 | -3.0303 | 3889 | 429 | 3680 | 441 | 2.797203 |
MSF_GET /search/instances: contributors = randomword* | 393 | 57 | 416 | 46 | -19.2982 | 3892 | 101 | 3680 | 227 | 124.7525 |
MSF_GET /search/instances: contributors == 2random words | 393 | 23 | 416 | 17 | -26.087 | 3880 | 78 | 3679 | 217 | 178.2051 |
MSF_GET /search/instances: contributors all 2random words | 393 | 23 | 416 | 16 | -30.4348 | 3876 | 85 | 3677 | 231 | 171.7647 |
MSF_GET /search/instances: contributors all randomword | 393 | 58 | 416 | 47 | -18.9655 | 3896 | 109 | 3680 | 232 | 112.844 |
MSF_GET /search/instances: contributors any 2random words | 393 | 65 | 416 | 51 | -21.5385 | 3885 | 115 | 3680 | 244 | 112.1739 |
MSF_GET /search/instances: keyword all random sentence AND languages == randomlang | 786 | 40 | 832 | 35 | -12.5 | 7747 | 98 | 7354 | 233 | 137.7551 |
MSF_GET /search/instances: languages == (lang) AND items.status.name == ("Available" OR "In transit") | 786 | 119 | 832 | 113 | -5.04202 | 7743 | 273 | 7350 | 346 | 26.73993 |
MSF_GET /search/instances: languages == lang | 786 | 110 | 832 | 104 | -5.45455 | 7743 | 260 | 7349 | 344 | 32.30769 |
MSF_GET /search/instances: languages == lang AND items.status.name == "Available" | 786 | 123 | 832 | 114 | -7.31707 | 7744 | 287 | 7350 | 353 | 22.99652 |
MSF_GET /search/instances: subjects <> 1randomword | 393 | 70 | 416 | 59 | -15.7143 | 3867 | 126 | 3670 | 338 | 168.254 |
MSF_GET /search/instances: subjects = (randomword OR randomword) | 393 | 67 | 416 | 52 | -22.3881 | 3905 | 129 | 3682 | 247 | 91.47287 |
MSF_GET /search/instances: subjects = *1randomword | 393 | 314 | 416 | 318 | 1.273885 | 3868 | 645 | 3672 | 601 | -6.82171 |
MSF_GET /search/instances: subjects = 1randomword* | 393 | 70 | 416 | 58 | -17.1429 | 3869 | 113 | 3672 | 235 | 107.9646 |
MSF_GET /search/instances: subjects == 1randomword | 393 | 40 | 416 | 32 | -20 | 3868 | 123 | 3670 | 232 | 88.61789 |
MSF_GET /search/instances: subjects all 1randomword | 393 | 47 | 416 | 37 | -21.2766 | 3869 | 124 | 3672 | 241 | 94.35484 |
MSF_GET /search/instances: subjects all randomword AND title all randomword | 393 | 36 | 416 | 27 | -25 | 3930 | 98 | 3682 | 237 | 141.8367 |
MSF_GET /search/instances: subjects all randomword NOT title all randomword | 393 | 81 | 416 | 67 | -17.284 | 3900 | 125 | 3681 | 235 | 88 |
MSF_GET /search/instances: subjects all randomword OR title all randomword | 393 | 96 | 416 | 83 | -13.5417 | 3913 | 165 | 3682 | 261 | 58.18182 |
MSF_GET /search/instances: subjects any 2random words | 393 | 63 | 416 | 52 | -17.4603 | 3868 | 133 | 3670 | 255 | 91.72932 |
MSF_GET /search/instances: title <> 3 word sentence | 393 | 167 | 416 | 167 | 0 | 3863 | 403 | 3670 | 415 | 2.977667 |
MSF_GET /search/instances: title == 3 word sentence | 393 | 36 | 416 | 29 | -19.4444 | 3866 | 93 | 3670 | 237 | 154.8387 |
MSF_GET /search/instances: title all *1randomword | 393 | 3403 | 416 | 3465 | 1.821922 | 3859 | 5471 | 3670 | 3984 | -27.1797 |
MSF_GET /search/instances: title all 1randomword* | 393 | 94 | 416 | 78 | -17.0213 | 3860 | 144 | 3670 | 264 | 83.33333 |
MSF_GET /search/instances: title all 3 word sentence | 393 | 40 | 416 | 38 | -5 | 3867 | 101 | 3670 | 236 | 133.6634 |
MSF_GET /search/instances: title any 3 word sentence | 393 | 408 | 416 | 395 | -3.18627 | 3867 | 735 | 3670 | 653 | -11.1565 |
Total | 16901 | 194.1087 | 17895 | 185.1522 | -4.61418 | 170397 | 365.1304 | 158131 | 382.1522 | 4.661824 |
Test Details
...
1 user - non-Eureka
transaction | Number Of Samples | Average | Median | pct90 | pct95 | pct99 | Min | Max |
---|---|---|---|---|---|---|---|---|
MSF_GET /search/authorities keyword <> random sentence | 393 | 207 | 206 | 241 | 252 | 266 | 171 | 266 |
MSF_GET /search/authorities keyword <> randomword | 393 | 202 | 202 | 241 | 250 | 311 | 165 | 311 |
MSF_GET /search/authorities keyword = *random sentence* | 393 | 1224 | 1220 | 1468 | 1481 | 1509 | 921 | 1509 |
MSF_GET /search/authorities keyword = random sentence | 393 | 30 | 30 | 39 | 53 | 115 | 22 | 116 |
MSF_GET /search/authorities keyword = randomword | 393 | 44 | 44 | 91 | 134 | 201 | 19 | 201 |
MSF_GET /search/authorities keyword == random sentence | 393 | 29 | 28 | 40 | 46 | 64 | 21 | 65 |
MSF_GET /search/authorities keyword == randomword | 393 | 43 | 44 | 112 | 136 | 175 | 19 | 175 |
MSF_GET /search/authorities keyword all *randomword* | 393 | 891 | 895 | 1331 | 1343 | 1382 | 500 | 1382 |
MSF_GET /search/authorities keyword all random sentence | 393 | 32 | 30 | 43 | 65 | 196 | 23 | 196 |
MSF_GET /search/authorities keyword all randomword | 394 | 67 | 64 | 173 | 332 | 383 | 19 | 383 |
MSF_GET /search/authorities keyword any random sentence | 393 | 99 | 83 | 218 | 305 | 310 | 23 | 310 |
MSF_GET /search/authorities keyword any randomword | 394 | 55 | 55 | 140 | 152 | 244 | 18 | 244 |
MSF_GET /search/instances: contributors <> 2random words | 393 | 158 | 158 | 183 | 188 | 225 | 131 | 225 |
MSF_GET /search/instances: contributors = *randomword | 393 | 198 | 189 | 394 | 646 | 668 | 157 | 668 |
MSF_GET /search/instances: contributors = randomword* | 393 | 57 | 48 | 210 | 221 | 263 | 17 | 264 |
MSF_GET /search/instances: contributors == 2random words | 393 | 23 | 23 | 34 | 51 | 144 | 16 | 145 |
MSF_GET /search/instances: contributors all 2random words | 393 | 23 | 23 | 32 | 44 | 103 | 17 | 103 |
MSF_GET /search/instances: contributors all randomword | 393 | 58 | 58 | 159 | 225 | 396 | 17 | 398 |
MSF_GET /search/instances: contributors any 2random words | 393 | 65 | 66 | 134 | 187 | 434 | 18 | 437 |
MSF_GET /search/instances: keyword all random sentence AND languages == randomlang | 786 | 40 | 29 | 131 | 257 | 294 | 22 | 294 |
MSF_GET /search/instances: languages == (lang) AND items.status.name == ("Available" OR "In transit") | 786 | 119 | 119 | 264 | 271 | 319 | 41 | 319 |
MSF_GET /search/instances: languages == lang | 786 | 110 | 110 | 248 | 252 | 294 | 40 | 294 |
MSF_GET /search/instances: languages == lang AND items.status.name == "Available" | 786 | 123 | 121 | 262 | 270 | 331 | 41 | 331 |
MSF_GET /search/instances: subjects <> 1randomword | 393 | 70 | 69 | 115 | 159 | 228 | 18 | 229 |
MSF_GET /search/instances: subjects = (randomword OR randomword) | 393 | 67 | 67 | 118 | 192 | 565 | 19 | 565 |
MSF_GET /search/instances: subjects = *1randomword | 393 | 314 | 309 | 475 | 543 | 546 | 259 | 546 |
MSF_GET /search/instances: subjects = 1randomword* | 393 | 70 | 63 | 208 | 309 | 322 | 17 | 322 |
MSF_GET /search/instances: subjects == 1randomword | 393 | 40 | 40 | 73 | 94 | 258 | 16 | 259 |
MSF_GET /search/instances: subjects all 1randomword | 393 | 47 | 46 | 91 | 124 | 442 | 18 | 444 |
MSF_GET /search/instances: subjects all randomword AND title all randomword | 393 | 36 | 33 | 76 | 124 | 136 | 19 | 136 |
MSF_GET /search/instances: subjects all randomword NOT title all randomword | 393 | 81 | 77 | 162 | 302 | 407 | 19 | 409 |
MSF_GET /search/instances: subjects all randomword OR title all randomword | 393 | 96 | 96 | 199 | 298 | 670 | 30 | 673 |
MSF_GET /search/instances: subjects any 2random words | 393 | 63 | 60 | 125 | 228 | 380 | 19 | 381 |
MSF_GET /search/instances: title <> 3 word sentence | 393 | 167 | 167 | 197 | 207 | 218 | 138 | 218 |
MSF_GET /search/instances: title == 3 word sentence | 393 | 36 | 29 | 134 | 200 | 218 | 21 | 218 |
MSF_GET /search/instances: title all *1randomword | 393 | 3403 | 3401 | 4602 | 7838 | 9273 | 2276 | 9273 |
MSF_GET /search/instances: title all 1randomword* | 393 | 94 | 87 | 230 | 270 | 722 | 22 | 727 |
MSF_GET /search/instances: title all 3 word sentence | 393 | 40 | 31 | 135 | 153 | 186 | 20 | 186 |
MSF_GET /search/instances: title any 3 word sentence | 393 | 408 | 384 | 1498 | 1611 | 1820 | 39 | 1823 |
MSF_TC: mod search by auth query fs09000000 | 393 | 2923 | 2895 | 3552 | 3735 | 3778 | 2040 | 3778 |
MSF_TC: mod search by boolean query fs09000000 | 393 | 280 | 274 | 550 | 616 | 1012 | 112 | 1014 |
MSF_TC: mod search by contributors query fs09000000 | 393 | 583 | 567 | 998 | 1149 | 1687 | 392 | 1696 |
MSF_TC: mod search by filter query fs09000000 | 393 | 396 | 377 | 886 | 1066 | 1080 | 150 | 1080 |
MSF_TC: mod search by keyword query fs09000000 | 393 | 394 | 378 | 864 | 974 | 990 | 151 | 990 |
MSF_TC: mod search by subject query fs09000000 | 393 | 603 | 587 | 903 | 944 | 1578 | 365 | 1583 |
MSF_TC: mod search by title query fs09000000 | 393 | 4149 | 4084 | 5985 | 8930 | 10027 | 2617 | 10027 |
...
transaction | Number Of Samples | Average | Median | pct90 | pct95 | pct99 | Min | Max |
---|---|---|---|---|---|---|---|---|
MSF_GET /search/authorities keyword <> random sentence | 3682 | 477 | 487 | 862 | 1148 | 2214 | 175 | 2400 |
MSF_GET /search/authorities keyword <> randomword | 3684 | 462 | 472 | 850 | 1108 | 2423 | 166 | 2848 |
MSF_GET /search/authorities keyword = *random sentence* | 3682 | 1545 | 1555 | 2153 | 2548 | 4332 | 941 | 4350 |
MSF_GET /search/authorities keyword = random sentence | 3682 | 245 | 252 | 653 | 993 | 2623 | 19 | 2635 |
MSF_GET /search/authorities keyword = randomword | 3684 | 234 | 236 | 608 | 973 | 3428 | 16 | 3451 |
MSF_GET /search/authorities keyword == random sentence | 3683 | 225 | 233 | 591 | 885 | 1783 | 20 | 1792 |
MSF_GET /search/authorities keyword == randomword | 3683 | 244 | 252 | 625 | 965 | 3221 | 16 | 3239 |
MSF_GET /search/authorities keyword all *randomword* | 3683 | 1191 | 1206 | 1816 | 2117 | 4118 | 518 | 4139 |
MSF_GET /search/authorities keyword all random sentence | 3683 | 243 | 251 | 631 | 936 | 3322 | 21 | 3341 |
MSF_GET /search/authorities keyword all randomword | 3686 | 262 | 266 | 660 | 1035 | 2643 | 17 | 2652 |
MSF_GET /search/authorities keyword any random sentence | 3683 | 272 | 279 | 603 | 902 | 2910 | 20 | 2920 |
MSF_GET /search/authorities keyword any randomword | 3685 | 232 | 237 | 592 | 947 | 3309 | 16 | 3332 |
MSF_GET /search/instances: contributors <> 2random words | 3679 | 408 | 418 | 786 | 1073 | 2685 | 133 | 2702 |
MSF_GET /search/instances: contributors = *randomword | 3680 | 441 | 451 | 844 | 1064 | 2958 | 162 | 2969 |
MSF_GET /search/instances: contributors = randomword* | 3680 | 227 | 234 | 561 | 882 | 3076 | 14 | 3094 |
MSF_GET /search/instances: contributors == 2random words | 3679 | 217 | 226 | 594 | 902 | 2062 | 14 | 2073 |
MSF_GET /search/instances: contributors all 2random words | 3677 | 231 | 239 | 613 | 952 | 3320 | 14 | 3338 |
MSF_GET /search/instances: contributors all randomword | 3680 | 232 | 239 | 592 | 973 | 3142 | 14 | 3157 |
MSF_GET /search/instances: contributors any 2random words | 3680 | 244 | 252 | 622 | 984 | 2020 | 15 | 2030 |
MSF_GET /search/instances: keyword all random sentence AND languages == randomlang | 7354 | 233 | 237 | 614 | 901 | 3484 | 19 | 3511 |
MSF_GET /search/instances: languages == (lang) AND items.status.name == ("Available" OR "In transit") | 7350 | 346 | 356 | 772 | 1084 | 3477 | 39 | 3501 |
MSF_GET /search/instances: languages == lang | 7349 | 344 | 350 | 797 | 1114 | 3435 | 38 | 3458 |
MSF_GET /search/instances: languages == lang AND items.status.name == "Available" | 7350 | 353 | 360 | 775 | 1085 | 3426 | 39 | 3449 |
MSF_GET /search/instances: subjects <> 1randomword | 3670 | 338 | 255 | 926 | 1177 | 2866 | 14 | 2880 |
MSF_GET /search/instances: subjects = (randomword OR randomword) | 3682 | 247 | 256 | 609 | 918 | 2879 | 16 | 2896 |
MSF_GET /search/instances: subjects = *1randomword | 3672 | 601 | 610 | 1032 | 1365 | 2939 | 268 | 2940 |
MSF_GET /search/instances: subjects = 1randomword* | 3672 | 235 | 241 | 589 | 877 | 3489 | 14 | 3509 |
MSF_GET /search/instances: subjects == 1randomword | 3670 | 232 | 238 | 595 | 1004 | 2564 | 15 | 2573 |
MSF_GET /search/instances: subjects all 1randomword | 3672 | 241 | 248 | 635 | 898 | 3062 | 16 | 3082 |
MSF_GET /search/instances: subjects all randomword AND title all randomword | 3682 | 237 | 243 | 620 | 976 | 2919 | 13 | 2935 |
MSF_GET /search/instances: subjects all randomword NOT title all randomword | 3681 | 235 | 242 | 580 | 853 | 2493 | 16 | 2508 |
MSF_GET /search/instances: subjects all randomword OR title all randomword | 3682 | 261 | 270 | 637 | 998 | 2581 | 26 | 2582 |
MSF_GET /search/instances: subjects any 2random words | 3670 | 255 | 264 | 640 | 1031 | 2757 | 15 | 2759 |
MSF_GET /search/instances: title <> 3 word sentence | 3670 | 415 | 424 | 770 | 1087 | 2284 | 140 | 2295 |
MSF_GET /search/instances: title == 3 word sentence | 3670 | 237 | 244 | 634 | 1073 | 2361 | 18 | 2367 |
MSF_GET /search/instances: title all *1randomword | 3670 | 3984 | 3988 | 5754 | 6226 | 7451 | 2260 | 7453 |
MSF_GET /search/instances: title all 1randomword* | 3670 | 264 | 273 | 678 | 977 | 2829 | 17 | 2839 |
MSF_GET /search/instances: title all 3 word sentence | 3670 | 236 | 243 | 628 | 891 | 3082 | 18 | 3091 |
MSF_GET /search/instances: title any 3 word sentence | 3670 | 653 | 642 | 1974 | 2483 | 5288 | 36 | 5311 |
MSF_TC: mod search by auth query fs09000000 | 3682 | 5627 | 5750 | 7399 | 8206 | 10533 | 2217 | 10551 |
MSF_TC: mod search by boolean query fs09000000 | 3681 | 980 | 1015 | 1870 | 2341 | 4271 | 107 | 4272 |
MSF_TC: mod search by contributors query fs09000000 | 3677 | 1998 | 2069 | 3160 | 3756 | 6881 | 423 | 6898 |
MSF_TC: mod search by filter query fs09000000 | 3677 | 1267 | 1310 | 2360 | 2812 | 5026 | 144 | 5043 |
MSF_TC: mod search by keyword query fs09000000 | 3672 | 1273 | 1315 | 2334 | 2785 | 6416 | 142 | 6444 |
MSF_TC: mod search by subject query fs09000000 | 3670 | 1900 | 1881 | 3226 | 3637 | 5916 | 391 | 5920 |
MSF_TC: mod search by title query fs09000000 | 3670 | 5787 | 5851 | 8198 | 9116 | 11512 | 2621 | 11530 |
Resource Utilization
Memory Utilization
1 user - non-Eureka
1 user - Eureka
20 users - non-Eureka
20 users - Eureka
Service CPU Utilization
1 user - non-Eureka
1 user - Eureka
20 users - non-Eureka
20 users - Eureka
Instance CPU Utilization
1 user - non-Eureka
1 user - Eureka
20 users - non-Eureka
20 users - Eureka
RDS CPU Utilization
1 user - non-Eureka
1 user - Eureka
20 users - non-Eureka
20 users - Eureka
RDS Connections count
1 user - non-Eureka
1 user - Eureka
20 users - non-Eureka
20 users - Eureka
OpenSearch metrics
Additional information
...
- Different permutations of random words and sentences were generated from https://www.mit.edu/~ecprice/wordlist.10000
- Artifact stored http://github.com/folio-org/perf-testing/mod-search
- runtime 60 minutes
...