Overview
- In this workflow, we load test mod-search for the Quesnelia release - - PERF-993Getting issue details... STATUS
We tested with 1, 20 virtual users on non-Eureka and Eureka environments.
Summary
Service CPU utilization was up to 60% 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%.
Recommendations & Jiras
Errors during 20 users - non-Eureka test are due to very high load for OpenSearch cluster. For this test we have throughput about 55 ops/s and maximal Elastic Search throughput is 52 search operations (https://repost.aws/knowledge-center/opensearch-resolve-429-error) according to our claster 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 /Results
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 | 199179 | 183864 |
Average throughput | 5.44 ops/s | 5.77 ops/s | 55.2 ops/s | 50.9 ops/s |
Test Details & Resource Utilization
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 |
1 user - Eureka
20 users - non-Eureka
transaction | NumberOfSamples | Average | Median | pct90 | pct95 | pct99 | Min | Max | Error Count |
FOLIO: Login | 1 | 406 | 406 | 406 | 406 | 406 | 406 | 406 | |
GET bl-users/_self | 1 | 240 | 240 | 240 | 240 | 240 | 240 | 240 | |
JSR223 Sampler Clear file | 1 | 259 | 259 | 259 | 259 | 259 | 259 | 259 | |
JSR223 Sampler User info extractor | 1 | 52 | 52 | 52 | 52 | 52 | 52 | 52 | |
MSF_GET /search/authorities keyword <> random sentence | 3943 | 540 | 553 | 982 | 1317 | 2853 | 28 | 2868 | 5 |
MSF_GET /search/authorities keyword <> randomword | 4104 | 516 | 532 | 934 | 1283 | 3170 | 27 | 3177 | 61 |
MSF_GET /search/authorities keyword = *random sentence* | 3933 | 2120 | 2166 | 2965 | 3249 | 4537 | 37 | 4539 | 2 |
MSF_GET /search/authorities keyword = random sentence | 3937 | 95 | 96 | 283 | 513 | 1499 | 20 | 1510 | 4 |
MSF_GET /search/authorities keyword = randomword | 4246 | 127 | 130 | 422 | 666 | 2186 | 17 | 2199 | 142 |
MSF_GET /search/authorities keyword == random sentence | 3949 | 92 | 95 | 285 | 485 | 1442 | 21 | 1452 | 6 |
MSF_GET /search/authorities keyword == randomword | 4041 | 138 | 140 | 439 | 844 | 2044 | 18 | 2049 | 43 |
MSF_GET /search/authorities keyword all *randomword* | 3997 | 1626 | 1668 | 2593 | 2876 | 4135 | 24 | 4148 | 17 |
MSF_GET /search/authorities keyword all random sentence | 3979 | 104 | 106 | 338 | 565 | 2167 | 22 | 2173 | 21 |
MSF_GET /search/authorities keyword all randomword | 5481 | 141 | 146 | 466 | 760 | 2589 | 16 | 2606 | 863 |
MSF_GET /search/authorities keyword any random sentence | 3958 | 226 | 233 | 620 | 953 | 2603 | 22 | 2618 | 8 |
MSF_GET /search/authorities keyword any randomword | 4618 | 129 | 132 | 426 | 758 | 2308 | 18 | 2324 | 372 |
MSF_GET /search/instances: contributors <> 2random words | 3877 | 379 | 389 | 677 | 953 | 2098 | 75 | 2108 | 1 |
MSF_GET /search/instances: contributors = *randomword | 3889 | 429 | 439 | 760 | 1099 | 2051 | 25 | 2062 | 1 |
MSF_GET /search/instances: contributors = randomword* | 3892 | 101 | 104 | 343 | 666 | 1841 | 15 | 1852 | 3 |
MSF_GET /search/instances: contributors == 2random words | 3880 | 78 | 79 | 268 | 475 | 1580 | 15 | 1592 | 2 |
MSF_GET /search/instances: contributors all 2random words | 3876 | 85 | 87 | 289 | 511 | 1806 | 16 | 1816 | 2 |
MSF_GET /search/instances: contributors all randomword | 3896 | 109 | 111 | 376 | 612 | 2466 | 15 | 2481 | 4 |
MSF_GET /search/instances: contributors any 2random words | 3885 | 115 | 117 | 378 | 635 | 1942 | 17 | 1951 | 4 |
MSF_GET /search/instances: keyword all random sentence AND languages == randomlang | 7747 | 98 | 100 | 305 | 530 | 2357 | 20 | 2374 | 3 |
MSF_GET /search/instances: languages == (lang) AND items.status.name == ("Available" OR "In transit") | 7743 | 273 | 278 | 699 | 963 | 2421 | 40 | 2424 | |
MSF_GET /search/instances: languages == lang | 7743 | 260 | 265 | 677 | 919 | 2186 | 40 | 2190 | 1 |
MSF_GET /search/instances: languages == lang AND items.status.name == "Available" | 7744 | 287 | 292 | 738 | 986 | 2456 | 41 | 2470 | |
MSF_GET /search/instances: subjects <> 1randomword | 3867 | 126 | 121 | 388 | 732 | 2354 | 17 | 2358 | |
MSF_GET /search/instances: subjects = (randomword OR randomword) | 3905 | 129 | 129 | 422 | 663 | 2617 | 18 | 2631 | 5 |
MSF_GET /search/instances: subjects = *1randomword | 3868 | 645 | 659 | 1014 | 1405 | 3126 | 261 | 3133 | |
MSF_GET /search/instances: subjects = 1randomword* | 3869 | 113 | 114 | 361 | 642 | 2184 | 16 | 2192 | 1 |
MSF_GET /search/instances: subjects == 1randomword | 3868 | 123 | 124 | 410 | 707 | 2189 | 16 | 2195 | 1 |
MSF_GET /search/instances: subjects all 1randomword | 3869 | 124 | 127 | 392 | 607 | 2507 | 16 | 2519 | |
MSF_GET /search/instances: subjects all randomword AND title all randomword | 3930 | 98 | 99 | 326 | 590 | 2195 | 17 | 2211 | 17 |
MSF_GET /search/instances: subjects all randomword NOT title all randomword | 3900 | 125 | 127 | 374 | 615 | 1971 | 18 | 1980 | 4 |
MSF_GET /search/instances: subjects all randomword OR title all randomword | 3913 | 165 | 169 | 465 | 761 | 2590 | 27 | 2604 | 8 |
MSF_GET /search/instances: subjects any 2random words | 3868 | 133 | 138 | 399 | 663 | 2313 | 19 | 2325 | |
MSF_GET /search/instances: title <> 3 word sentence | 3863 | 403 | 411 | 737 | 1022 | 2582 | 30 | 2596 | 3 |
MSF_GET /search/instances: title == 3 word sentence | 3866 | 93 | 93 | 301 | 541 | 1697 | 18 | 1705 | 3 |
MSF_GET /search/instances: title all *1randomword | 3859 | 5471 | 5549 | 8145 | 8699 | 10240 | 26 | 10241 | 4 |
MSF_GET /search/instances: title all 1randomword* | 3860 | 144 | 147 | 410 | 654 | 2262 | 20 | 2278 | 1 |
MSF_GET /search/instances: title all 3 word sentence | 3867 | 101 | 102 | 336 | 535 | 1924 | 19 | 1932 | |
MSF_GET /search/instances: title any 3 word sentence | 3867 | 735 | 741 | 2713 | 3093 | 4191 | 34 | 4203 | |
MSF_TC: mod search by auth query fs09000000 | 5475 | 5724 | 6037 | 7625 | 8208 | 10745 | 24 | 10772 | 1544 |
MSF_TC: mod search by boolean query fs09000000 | 3930 | 515 | 536 | 1199 | 1765 | 3572 | 27 | 3587 | 34 |
MSF_TC: mod search by contributors query fs09000000 | 3891 | 1295 | 1339 | 2194 | 2721 | 4735 | 30 | 4750 | 17 |
MSF_TC: mod search by filter query fs09000000 | 3874 | 917 | 944 | 2108 | 2543 | 4522 | 147 | 4540 | 1 |
MSF_TC: mod search by keyword query fs09000000 | 3872 | 913 | 937 | 2115 | 2485 | 4516 | 35 | 4530 | 3 |
MSF_TC: mod search by subject query fs09000000 | 3869 | 1262 | 1291 | 2177 | 2853 | 5627 | 379 | 5640 | 2 |
MSF_TC: mod search by title query fs09000000 | 3866 | 6939 | 7072 | 10201 | 11284 | 14160 | 355 | 14171 | 11 |
20 users - Eureka
Additional information
environments: qcp1-non-Eureka, qecp1-Eureka
- Different permutations of random words and sentences were generated from https://www.mit.edu/~ecprice/wordlist.10000
- Artifact stored http://carrier-io.int.folio.ebsco.com/artifacts?q=mod-search - mod-search.zip
- runtime 60 minutes
Ran mod-search load testing for the following variant of queries:
- authority key search
- boolean search
- contributors search
- filter search
- keyword search
- subjects search
- title search
- wildcard search
- wildcard prefix search