Jira Legacy
Jira Legacy | ||||||||
---|---|---|---|---|---|---|---|---|
|
Table of Contents |
---|
...
In this api, we are checking the performance of placing a holding on a discovery service interface (EDS) running in the Fameflower release -
...
- The placing a hold request takes about 1 seconds: POST /patron/account/{id}/instance/{instanceId}/hold.
- Seems like the main issue is the mod-circulation instance-level request API, POST /circulation/requests/instances which is called by mod-patron subsequently.
POST POST /patron/account/{id}/instance/{instanceId}/hold and POST /circulation/requests/instances show almost the same response time. In addition, mod-circulation's native item-level request code is 24.5% faster than mod-circulation's instance-level request code. Seems like the main issue is the mod-circulation instance-level request API, POST /circulation/requests/instances which is called by mod-patron subsequently. - JVM profiling shows the slowest operations, totalling more CPU time than other calls:
- logging with INFO level - Logging level could be reduced to WARNING or ERROR, but at the cost of having less data to work with should there be a need to troubleshoot. The most CPU consuming methods are org.folio.circulation.support.Result.next and org.folio.circulation.support.Result.after from org.folio.circulation.support.SingleRecordFetcher, and org.folio.circulation.support.SingleRecordFetcher.fetch method
- JSON de/serialization - fasterxml.jackson.databind.ObjectMapper.readValue method of mod-circulation-storage and mod-inventory-storage consumed high CPU resources as there were a lot of JSON decoding, this implementation could be reviewed for optimisation possibilities. The most CPU consuming methods are org.folio.rest.persist.PgUtil.streamGet from org.folio.rest.impl.InstanceStorageAPI.getInstanceStorageInstancesByInstanceId (mod-inventory-storage), org.folio.rest.impl.HoldingsStorageAPI.getHoldingsStorageHoldings(mod-inventory-storage) and org.folio.rest.persist.PostgresClient.doGet from org.folio.rest.impl.LoansAPI.getLoanStorageLoans and org.folio.rest.impl.RequestsAPI.getRequestStorageRequests(mod-circulation-storage)
- request's validation - need to consider using a more efficient request's validation instead of org.hibernate.validator.internal.engine.ValidatorImpl.validate method because it's one of the slowest operations. The slowest method is org.folio.rest.RestVerticle.route and org.folio.rest.RestVerticle.parseParams
- mod-circulation-storage and mod-feesfines generated missing indexes warnings, see Recommended Improvements for the JIRAs that were created/covered by this testing effort.
...
Test | Virtual Users | Duration | OKAPI log level | Profiled | Ramp up (total time in seconds) | API call |
1. | 1 | 30 min | WARNING | No | 1 | POST /patron/account/{id}/instance/{instanceId}/hold |
2. | 5 | 30 min | WARNING | No | 50 | POST /patron/account/{id}/instance/{instanceId}/hold |
3. | 8 | 30 min | WARNING | No | 80 | POST /patron/account/{id}/instance/{instanceId}/hold |
4. | 20 | 30 min | WARNING | No | 200 | POST /patron/account/{id}/instance/{instanceId}/hold |
5. | 20 | 30 min | WARNING | Yes | 200 | POST /patron/account/{id}/instance/{instanceId}/hold |
6. | 1 | 30 min | WARNING | No | 1 | POST /circulation/requests/instances |
7. | 5 | 30 min | WARNING | No | 50 | POST /circulation/requests/instances |
8. | 8 | 30 min | WARNING | No | 80 | POST /circulation/requests/instances |
9. | 20 | 30 min | WARNING | No | 200 | POST /circulation/requests/instances |
10. | 20 | 30 min | WARNING | Yes | 200 | POST /circulation/requests/instances |
11. | 1 | 30 min | WARNING | Yes | 1 | POST /circulation/requests |
12. | 8 | 30 min | WARNING | Yes | 200 | POST /circulation/requests |
Results
- An instance-level request to mod-patron
POST /patron/account/{id}/instance/{instanceId}/hold
Code Block { "item": { "instanceId": "c2063f7c-245a-4c24-b643-67fea831ebcc" }, "requestDate": "2020-06-01T18:51:24.000+0000", "pickupLocationId": "7068e104-aa14-4f30-a8bf-71f71cc15e07" }
Overall time for the placing holds api in seconds
Average 75th %tile 1 user 933.01 ms 1.10 s 5 users 1.01 s 1.12 s 8 users 1.03 s 1.18 s 20 users 1.33 s 1.47 s mod-patron subsequently calls mod-circulation to place instance-level requests
POST /circulation/requests/instances
Code Block { "requestDate": "2017-07-29T22:25:37Z", "requesterId": "21932a85-bd00-446b-9565-46e0c1a5490b", "instanceId": "195efae1-588f-47bd-a181-13a2eb437701", "requestExpirationDate": "2017-07-25T22:25:37Z", "pickupServicePointId": "8359f2bc-b83e-48e1-8a5b-ca1a74e840de" }
Overall time in seconds
Average 75th %tile 1 user 864.35 ms 1.01 s 5 users 1.09 s 1.14 s 8 users 1.15 s 1.18 s 20 users 1.58 s 1.53 s An Item-level request
POST /circulation/requests
Code Block { "requestDate": "2020-06-18T09:23:11.957Z", "requesterId": "e96618a9-04ee-4fea-aa60-306a8f4dd89b", "requestType": "Hold", "fulfilmentPreference": "Hold Shelf", "itemId": "0000023d-a95f-4396-8d37-42dda48cdf3d", "requestExpirationDate": "2020-06-18T09:23:11.957Z", "pickupServicePointId": "d80a641e-50b9-4bd2-99a2-a4a12c8515cb" }
Overall time in seconds
Average 75th %tile 1 user 807.90 ms 819.00 ms 8 users 855.92 ms 855.00 ms
The comparison table between an instance-level request and an Item-level request to mod-circulation (done 23.07.2020). The item-level request is 24.5% faster than an instance-level request
An instance-level request to mod-circulation POST /circulation/requests/instances | An Item-level request to mod-circulation POST /circulation/requests | |||
Average | 75th %tile | Average | 75th %tile | |
1 user | 1.07 s | 1.09 s | 807.90 ms | 819.00 ms |
8 users | 1.09 s | 1.09 s | 855.92 ms | 855.00 ms |
...
There aren't any WARNING statements of missing indexes in mod-inventory-storage, mod-patron modules.
The following WARNING statements of missing indexes were generated during a test run and logged by mod-circulation-storage:
...
The slowest query which took the most of execution time was initiated by the mod_circulation_storage service presented in the following table:
Percent of total time | Average Time,ms | Calls | Module | Query |
7% | 25 ms | 426 | mod_circulation_storage | SELECT jsonb,idFROM fs09000000_mod_circulation_storage.loan WHERE (lower(f_unaccent(loan.jsonb->'status'->>'name')) LIKE lower(f_unaccent('ClosedOpen'))) AND (loan.jsonb->>'userId' ~ '') LIMIT 5000 OFFSET 0 |
CPU Utilization
1 user | 5 users | 8 users | 20 users | |||||
---|---|---|---|---|---|---|---|---|
Average % | Range % | Average % | Range % | Average % | Range % | Average % | Range % | |
mod-circulation | 1.23 | 0-31.98 | 3 | 2-20 | 3 | 0-14 | 6 | 0-88 |
mod-circulation-storage | 0.61 | 0.25-6.60 | 1.73 | 0.23-26.77 | 2 | 0-6 | 3 | 0-9 |
mod-patron | 1 | 0-24 | 2 | 2-66 | 1 | 0-12 | 0 | 0-11 |
mod-feesfines | 100 | 101-102 | 100 | 101-103 | 100 | 101-103 | 100 | 101-103 |
...
- In mod-circulation, mod-circulation-storage, mod-inventory-storage consider using a more efficient JSON package or calling use the existing jackson serialization calls in a different way to address the item: JVM profiling shows JSON de/serialization operations one of the slowest operations.
- In mod-circulation consider using a more efficient request's validation instead of org.hibernate.validator.internal.engine.ValidatorImpl.validate method because it's one of the slowest operations.
- The following JIRAs have been created for mod-circulation-storage and mod-fees-fines:
Jira Legacy server FOLIO Issue TrackerSystem JIRA columns key,summary,type,created,updated,due,assignee,reporter,priority,status,resolution serverId 6ccf3fe401505d01-3301b853-368a3c2e-983e90f1-20c466b11a49ee9b165564fc key CIRCSTORE-216
FOLIO Issue TrackerJira Legacy server
6ccf3fe4System JIRA serverId
330101505d01-
368ab853-
983e3c2e-
20c466b11a4990f1- ee9b165564fc key MODFEE-67 - Some missing indexes warnings are covered by the story
Jira Legacy server FOLIO Issue TrackerSystem JIRA serverId 6ccf3fe401505d01-3301b853-368a3c2e-983e90f1-20c466b11a49ee9b165564fc key CIRCSTORE-215 - Consider logging with ERROR level if not fixing the JIRA below to reduce the excess logging by mod-circulation-storage and mod-feesfines
- It will great for the modules to have custom metrics, such as rates and response times of out-going API and database calls so that we can get more insight on how an API behaves.
Discussions
We could not get to the bottom of instance-level requests slowness. That why we needed to look into item-level request. mod-circulation's native item-level request code is 24.5% faster than mod-circulation's instance-level request code.
Appendix
See Attached place-holds-FF.xlsx for details
...