PTF - [Quesnelia][Eureka] Searching via mod-search
Overview
- In this testing effort we perform load tests of mod-search on the Quesnelia release.
- These tests with 1, 20 virtual users were run in both Okapi Quesnelia (qcp1) environment for baseline numbers and Eureka Quesnelia (qecp1) environment with the goal of comparing Eureka's performance against Okapi FOLIO.
- - PERF-993Getting issue details... STATUS
Summary
For a single user, performance is better in the Eureka environment. However, when scaled to 20 vusers, there is a performance degradation of approximately 7.8%
- It is impossible to reach an average throughput higher than 50.9 ops/s for the Eureka environment (for non-Eureka environment over 55.2 ops/s). A higher number of users up to 60 will only increase response time even if we have 4 tasks for mod-search. We observed an increase in response time from sidecar-mod-search from 282ms for 5 vusers and up to 1,2 seconds for 60 vusers. Additional information in this table.
- 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 vusers - non-Eureka.
- Open search CPU utilization was up to 100% with 20 user tests.
Service CPU utilization was up to 14% for mod-search, for all other services CPU did not exceed 6%.
Memory utilization was stable and no memory leaks or OOM issues were observed.
RDS CPU utilization was about up to 10% for all tests.
- Non-Eureka environment uses 50 fewer database connections than Eureka. The number of connections for mod-search was the same for both environments
{ "name": "DB_MAXPOOLSIZE", "value": "20" },
Recommendations & Jiras
Errors during 20 vusers - 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
60 minutes tests
Test# | Test name | results | Comments |
---|---|---|---|
1 | 1 vuser - non-Eureka | Success | 0 errors |
2 | 20 vusers - non-Eureka | Completed with errors | 3224 errors out of 199179 API calls ERROR: "Too Many Requests" |
3 | 20 vusers - non-Eureka retest | Completed with errors | 41894 errors out of 252249 API calls ERROR: "Too Many Requests" |
4 | 1 vuser - Eureka | Success | 0 errors |
5 | 20 vusers - 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 vuser - non-Eureka(avg) | 1 vuser - Eureka (avg) | % | 20 vusers - non-Eureka(avg) | 20 vusers - 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% |
Average response time for all of the samples | 216.75 | 206.57 | -4.93% | 407.68 | 438.35 | 7.0% |
1 vuser - non-Eureka | 1 vuser - Eureka | 20 vusers - non-Eureka | 20 vusers - 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.38 | 3943 | 540 | 3682 | 477 | -11.67 |
MSF_GET /search/authorities keyword <> randomword | 393 | 202 | 417 | 194 | -3.96 | 4104 | 516 | 3684 | 462 | -10.47 |
MSF_GET /search/authorities keyword = *random sentence* | 393 | 1224 | 416 | 1142 | -6.7 | 3933 | 2120 | 3682 | 1545 | -27.12 |
MSF_GET /search/authorities keyword = random sentence | 393 | 30 | 416 | 23 | -23.33 | 3937 | 95 | 3682 | 245 | 157.89 |
MSF_GET /search/authorities keyword = randomword | 393 | 44 | 417 | 32 | -27.27 | 4246 | 127 | 3684 | 234 | 84.25 |
MSF_GET /search/authorities keyword == random sentence | 393 | 29 | 416 | 22 | -24.14 | 3949 | 92 | 3683 | 225 | 144.57 |
MSF_GET /search/authorities keyword == randomword | 393 | 43 | 417 | 31 | -27.90 | 4041 | 138 | 3683 | 244 | 76.81 |
MSF_GET /search/authorities keyword all *randomword* | 393 | 891 | 417 | 821 | -7.86 | 3997 | 1626 | 3683 | 1191 | -26.75 |
MSF_GET /search/authorities keyword all random sentence | 393 | 32 | 417 | 25 | -21.88 | 3979 | 104 | 3683 | 243 | 133.65 |
MSF_GET /search/authorities keyword all randomword | 394 | 67 | 417 | 54 | -19.40 | 5481 | 141 | 3686 | 262 | 85.82 |
MSF_GET /search/authorities keyword any random sentence | 393 | 99 | 416 | 86 | -13.13 | 3958 | 226 | 3683 | 272 | 20.35 |
MSF_GET /search/authorities keyword any randomword | 394 | 55 | 417 | 43 | -21.82 | 4618 | 129 | 3685 | 232 | 79.84 |
MSF_GET /search/instances: contributors <> 2random words | 393 | 158 | 416 | 152 | -3.80 | 3877 | 379 | 3679 | 408 | 7.65 |
MSF_GET /search/instances: contributors = *randomword | 393 | 198 | 416 | 192 | -3.03 | 3889 | 429 | 3680 | 441 | 2.80 |
MSF_GET /search/instances: contributors = randomword* | 393 | 57 | 416 | 46 | -19.30 | 3892 | 101 | 3680 | 227 | 124.75 |
MSF_GET /search/instances: contributors == 2random words | 393 | 23 | 416 | 17 | -26.09 | 3880 | 78 | 3679 | 217 | 178.21 |
MSF_GET /search/instances: contributors all 2random words | 393 | 23 | 416 | 16 | -30.43 | 3876 | 85 | 3677 | 231 | 171.76 |
MSF_GET /search/instances: contributors all randomword | 393 | 58 | 416 | 47 | -18.97 | 3896 | 109 | 3680 | 232 | 112.84 |
MSF_GET /search/instances: contributors any 2random words | 393 | 65 | 416 | 51 | -21.54 | 3885 | 115 | 3680 | 244 | 112.17 |
MSF_GET /search/instances: keyword all random sentence AND languages == randomlang | 786 | 40 | 832 | 35 | -12.5 | 7747 | 98 | 7354 | 233 | 137.76 |
MSF_GET /search/instances: languages == (lang) AND items.status.name == ("Available" OR "In transit") | 786 | 119 | 832 | 113 | -5.04 | 7743 | 273 | 7350 | 346 | 26.74 |
MSF_GET /search/instances: languages == lang | 786 | 110 | 832 | 104 | -5.45 | 7743 | 260 | 7349 | 344 | 32.31 |
MSF_GET /search/instances: languages == lang AND items.status.name == "Available" | 786 | 123 | 832 | 114 | -7.32 | 7744 | 287 | 7350 | 353 | 23.0 |
MSF_GET /search/instances: subjects <> 1randomword | 393 | 70 | 416 | 59 | -15.71 | 3867 | 126 | 3670 | 338 | 168.25 |
MSF_GET /search/instances: subjects = (randomword OR randomword) | 393 | 67 | 416 | 52 | -22.39 | 3905 | 129 | 3682 | 247 | 91.47 |
MSF_GET /search/instances: subjects = *1randomword | 393 | 314 | 416 | 318 | 1.27 | 3868 | 645 | 3672 | 601 | -6.82 |
MSF_GET /search/instances: subjects = 1randomword* | 393 | 70 | 416 | 58 | -17.14 | 3869 | 113 | 3672 | 235 | 107.96 |
MSF_GET /search/instances: subjects == 1randomword | 393 | 40 | 416 | 32 | -20 | 3868 | 123 | 3670 | 232 | 88.62 |
MSF_GET /search/instances: subjects all 1randomword | 393 | 47 | 416 | 37 | -21.28 | 3869 | 124 | 3672 | 241 | 94.35 |
MSF_GET /search/instances: subjects all randomword AND title all randomword | 393 | 36 | 416 | 27 | -25 | 3930 | 98 | 3682 | 237 | 141.84 |
MSF_GET /search/instances: subjects all randomword NOT title all randomword | 393 | 81 | 416 | 67 | -17.28 | 3900 | 125 | 3681 | 235 | 88 |
MSF_GET /search/instances: subjects all randomword OR title all randomword | 393 | 96 | 416 | 83 | -13.54 | 3913 | 165 | 3682 | 261 | 58.18 |
MSF_GET /search/instances: subjects any 2random words | 393 | 63 | 416 | 52 | -17.46 | 3868 | 133 | 3670 | 255 | 91.73 |
MSF_GET /search/instances: title <> 3 word sentence | 393 | 167 | 416 | 167 | 0 | 3863 | 403 | 3670 | 415 | 2.98 |
MSF_GET /search/instances: title == 3 word sentence | 393 | 36 | 416 | 29 | -19.44 | 3866 | 93 | 3670 | 237 | 154.84 |
MSF_GET /search/instances: title all *1randomword | 393 | 3403 | 416 | 3465 | 1.82 | 3859 | 5471 | 3670 | 3984 | -27.18 |
MSF_GET /search/instances: title all 1randomword* | 393 | 94 | 416 | 78 | -17.02 | 3860 | 144 | 3670 | 264 | 83.33 |
MSF_GET /search/instances: title all 3 word sentence | 393 | 40 | 416 | 38 | -5 | 3867 | 101 | 3670 | 236 | 133.66 |
MSF_GET /search/instances: title any 3 word sentence | 393 | 408 | 416 | 395 | -3.19 | 3867 | 735 | 3670 | 653 | -11.16 |
Total | 16901 | 194.11 | 17895 | 185.15 | -4.61 | 170397 | 365.13 | 158131 | 382.15 | 4.66 |
Average response time for all of the samples | 216.75 | 206.57 | -4.93 | 407.68 | 438.35 | 7.00 |
Test Details
1 vuser - 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 vuser - Eureka
transaction | Number Of Samples | Average | Median | pct90 | pct95 | pct99 | Min | Max |
---|---|---|---|---|---|---|---|---|
MSF_GET /search/authorities keyword <> random sentence | 416 | 200 | 199 | 233 | 240 | 276 | 167 | 276 |
MSF_GET /search/authorities keyword <> randomword | 417 | 194 | 192 | 227 | 268 | 293 | 161 | 293 |
MSF_GET /search/authorities keyword = *random sentence* | 416 | 1142 | 1144 | 1352 | 1381 | 1412 | 913 | 1412 |
MSF_GET /search/authorities keyword = random sentence | 416 | 23 | 22 | 26 | 84 | 98 | 18 | 98 |
MSF_GET /search/authorities keyword = randomword | 417 | 32 | 31 | 79 | 104 | 127 | 14 | 127 |
MSF_GET /search/authorities keyword == random sentence | 416 | 22 | 21 | 26 | 79 | 92 | 18 | 92 |
MSF_GET /search/authorities keyword == randomword | 417 | 31 | 29 | 66 | 90 | 174 | 14 | 174 |
MSF_GET /search/authorities keyword all *randomword* | 417 | 821 | 824 | 1216 | 1236 | 1345 | 492 | 1346 |
MSF_GET /search/authorities keyword all random sentence | 417 | 25 | 23 | 31 | 151 | 181 | 19 | 181 |
MSF_GET /search/authorities keyword all randomword | 417 | 54 | 48 | 152 | 234 | 544 | 15 | 548 |
MSF_GET /search/authorities keyword any random sentence | 416 | 86 | 67 | 182 | 563 | 581 | 18 | 581 |
MSF_GET /search/authorities keyword any randomword | 417 | 43 | 41 | 134 | 229 | 249 | 14 | 249 |
MSF_GET /search/instances: contributors <> 2random words | 416 | 152 | 151 | 173 | 184 | 195 | 129 | 195 |
MSF_GET /search/instances: contributors = *randomword | 416 | 192 | 181 | 271 | 670 | 676 | 158 | 676 |
MSF_GET /search/instances: contributors = randomword* | 416 | 46 | 36 | 203 | 245 | 379 | 12 | 379 |
MSF_GET /search/instances: contributors == 2random words | 416 | 17 | 16 | 34 | 58 | 224 | 12 | 225 |
MSF_GET /search/instances: contributors all 2random words | 416 | 16 | 15 | 19 | 23 | 41 | 13 | 41 |
MSF_GET /search/instances: contributors all randomword | 416 | 47 | 44 | 132 | 227 | 336 | 12 | 338 |
MSF_GET /search/instances: contributors any 2random words | 416 | 51 | 51 | 110 | 177 | 407 | 13 | 410 |
MSF_GET /search/instances: keyword all random sentence AND languages == randomlang | 832 | 35 | 22 | 178 | 372 | 510 | 17 | 510 |
MSF_GET /search/instances: languages == (lang) AND items.status.name == ("Available" OR "In transit") | 832 | 113 | 111 | 259 | 373 | 375 | 38 | 375 |
MSF_GET /search/instances: languages == lang | 832 | 104 | 103 | 242 | 247 | 255 | 36 | 255 |
MSF_GET /search/instances: languages == lang AND items.status.name == "Available" | 832 | 114 | 113 | 252 | 259 | 314 | 37 | 314 |
MSF_GET /search/instances: subjects <> 1randomword | 416 | 59 | 55 | 121 | 151 | 182 | 13 | 183 |
MSF_GET /search/instances: subjects = (randomword OR randomword) | 416 | 52 | 51 | 98 | 121 | 309 | 14 | 310 |
MSF_GET /search/instances: subjects = *1randomword | 416 | 318 | 306 | 481 | 843 | 870 | 264 | 870 |
MSF_GET /search/instances: subjects = 1randomword* | 416 | 58 | 47 | 239 | 269 | 538 | 12 | 538 |
MSF_GET /search/instances: subjects == 1randomword | 416 | 32 | 32 | 56 | 72 | 243 | 12 | 245 |
MSF_GET /search/instances: subjects all 1randomword | 416 | 37 | 35 | 78 | 114 | 239 | 13 | 240 |
MSF_GET /search/instances: subjects all randomword AND title all randomword | 416 | 27 | 22 | 87 | 108 | 141 | 14 | 141 |
MSF_GET /search/instances: subjects all randomword NOT title all randomword | 416 | 67 | 57 | 164 | 261 | 277 | 15 | 278 |
MSF_GET /search/instances: subjects all randomword OR title all randomword | 416 | 83 | 76 | 197 | 399 | 686 | 22 | 690 |
MSF_GET /search/instances: subjects any 2random words | 416 | 52 | 47 | 102 | 182 | 361 | 14 | 362 |
MSF_GET /search/instances: title <> 3 word sentence | 416 | 167 | 163 | 204 | 410 | 448 | 136 | 448 |
MSF_GET /search/instances: title == 3 word sentence | 416 | 29 | 22 | 88 | 241 | 258 | 16 | 258 |
MSF_GET /search/instances: title all *1randomword | 416 | 3465 | 3402 | 4696 | 7599 | 7650 | 2261 | 7650 |
MSF_GET /search/instances: title all 1randomword* | 416 | 78 | 66 | 272 | 363 | 701 | 16 | 707 |
MSF_GET /search/instances: title all 3 word sentence | 416 | 38 | 23 | 155 | 251 | 263 | 17 | 263 |
MSF_GET /search/instances: title any 3 word sentence | 416 | 395 | 373 | 1534 | 1684 | 1792 | 32 | 1795 |
MSF_TC: mod search by auth query fs09000000 | 416 | 2673 | 2633 | 3179 | 3948 | 4137 | 2021 | 4137 |
MSF_TC: mod search by boolean query fs09000000 | 416 | 229 | 207 | 495 | 769 | 1002 | 89 | 1005 |
MSF_TC: mod search by contributors query fs09000000 | 416 | 521 | 497 | 807 | 1311 | 1566 | 361 | 1575 |
MSF_TC: mod search by filter query fs09000000 | 416 | 375 | 348 | 854 | 1303 | 1357 | 133 | 1357 |
MSF_TC: mod search by keyword query fs09000000 | 416 | 369 | 348 | 820 | 1289 | 1336 | 133 | 1336 |
MSF_TC: mod search by subject query fs09000000 | 416 | 555 | 525 | 933 | 1383 | 1427 | 353 | 1427 |
MSF_TC: mod search by title query fs09000000 | 416 | 4172 | 4034 | 6379 | 9095 | 9209 | 2558 | 9209 |
20 vusers - non-Eureka
transaction | NumberOf Samples | Average | Median | pct90 | pct95 | pct99 | Min | Max | Error Count |
---|---|---|---|---|---|---|---|---|---|
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 vusers - Eureka
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 vuser - non-Eureka
1 vuser - Eureka
20 vusers - non-Eureka
20 vusers - Eureka
Service CPU Utilization
1 vuser - non-Eureka
1 vuser - Eureka
20 vusers - non-Eureka
20 vusers - Eureka
RDS CPU Utilization
1 vuser - non-Eureka
1 vuser - Eureka
20 vusers - non-Eureka
20 vusers - Eureka
RDS Connections count
1 vuser - non-Eureka
1 vuser - Eureka
20 vusers - non-Eureka
20 vusers - Eureka
OpenSearch metrics
Appendix
Infrastructure
PTF environment qecp1 |
---|
|
DB table records size:
|
---|
Files
Modules
PTF - QCP1 environment configuration
- 10 m6g.2xlarge EC2 instances located in US East (N. Virginia)us-east-1
1 database instance, writer
Name Memory GIB vCPUs db.r6g.xlarge
32 GB 4 vCPUs
- MSK fse-tenant
- 2 brokers, kafka.m7g.xlarge brokers in 2 zones
Apache Kafka version 3.7.x
EBS storage volume per broker 300 GiB
- auto.create.topics.enable=true
- log.retention.minutes=480
- default.replication.factor=3
- Open Search ptf-test
- Data nodes
- Instance type - r6g.2xlarge.search
- Number of nodes - 4
- Version: OpenSearch_2_13_R20240520-P5
- Dedicated master nodes
- Instance type - r6g.large.search
- Number of nodes - 3
- Data nodes
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://github.com/folio-org/perf-testing/mod-search
- test performed for 1 vuser ramp-up 1 sec
- test performed for 20 vusers ramp-up 200 sec
- runtime 60 minutes
Run 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
Additional screenshots:
They show how number of users affects sidecars response time (data from New Relic):
Service response time from New Relic | ||
Number of virtual users | sidecar-mod search | mod-search |
---|---|---|
5 | 282 ms | 283 ms |
10 | 503 ms | 204 ms |
20 | 633 ms | 215 ms |
30 | 861 ms | 222 ms |
40 | 913 ms | 227 ms |
start of the test up to 5 vusers
10 vusers
20 vusers
30 vusers
40 vusers