Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Jira Legacy
serverSystem JiraJIRA
columnskey,summary,type,created,updated,due,assignee,reporter,priority,status,resolution
serverId01505d01-b853-3c2e-90f1-ee9b165564fc
keyPERF-37

...

In this workflow we are checking the performance of the check in items workflow running in the Fameflower release

Jira Legacy
serverSystem JiraJIRA
columnskey,summary,type,created,updated,due,assignee,reporter,priority,status,resolution
serverId01505d01-b853-3c2e-90f1-ee9b165564fc
keyPERF-37
.  We tested it with 1, 5, 8, and 20 virtual users for 30 minutes.  

...

  1. Overall check in time is 781 ms for a typical use case of 8 users, 1127.57 ms for 20 users

  2. Slow APIs taking more than 100ms to run:
    1. POST checkin-by-barcode
    2. GET inventory/items
  3. mod-circulation-storage log warnings for missing indexes - 64K lines in  45 minutes run. Logging level could be reduced to WARNING or INFO, but at the cost of having less data to work with should there be a need to troubleshoot. Adding the . Adding the missing indexes could improve performance while stop logging these warnings Some mod-circulation-storage's SQL queries took more than 20ms to run, see the Slow Queries section and warning. See the Recommended Improvements for the JIRAs created to address these SQL queriesindexes. 
  4.  Image RemovedCIRCSTORE-215 - Missing Indexes Warnings CLOSED
  5. JVM profiling shows JSON de/serialization operations one of the slowest operations, totaling more CPU time than other calls.  Since FOLIO modules retrieve and stores JSON objects, making sure that serializing and deserializing JSON efficient is essential, see Recommended Improvements

...

Test

Virtual Users

Duration

OKAPI log level

Profiled

Ramp up (total time

in seconds)

1. 

1

30 min

WARNING

No

1

2. 

5

30 min

WARNING

No

50

3. 

8

30 min

WARNING

No

80

4. 

20

30 min

WARNING

No

200

5. 

8

30 min

WARNING

Yes

80

...

Results

  1. Overall check in items API workflow time in seconds

    For 30 minutesProfilerAverage 75th %tile
    1 userOFF379.88 ms379.88 ms
    5 usersOFF715.4 ms789.13 ms
    8 usersOFF781 ms822.02 ms
    20 usersOFF1127.57 ms1203.27 ms
    8 usersON1352.67 ms1415.58 ms


  2. Slow APIs taking more than 100 ms to return (Profiling OFF)

    API1 user (75th %tile)5 users (75th %tile)8 users (75th %tile)20 Users (75th %tile)

    POST checkin-by-barcode 

    379.88 ms470.19 ms508.61 ms750.88 ms
    Get inventory/items168.20 ms183.79 ms208.23 ms289.92 ms


...

Code Block
languagesql
linenumberstrue
WARNING: Doing SQL query without index for scheduled_notice.jsonb->>'nextRunTime', CQL >>> SQL: nextRunTime < 2020-07-01T06:06:52.364Z >>> scheduled_notice.jsonb->>'nextRunTime' <'2020-07-01T06:06:52.364Z'WARNING: Doing LIKE search without index for scheduled_notice.jsonb->'noticeConfig'->>'sendInRealTime', CQL >>> SQL: noticeConfig.sendInRealTime == true >>> lower(f_unaccent(scheduled_notice.jsonb->'noticeConfig'->>'sendInRealTime')) LIKE lower(f_unaccent('true'))
WARNING: Doing LIKE search without index for scheduled_notice.jsonb->>'triggeringEvent', CQL >>> SQL: triggeringEvent == "Hold expiration" >>> lower(f_unaccent(scheduled_notice.jsonb->>'triggeringEvent')) LIKE lower(f_unaccent('Hold expiration'))
WARNING: Doing LIKE search without index for scheduled_notice.jsonb->>'triggeringEvent', CQL >>> SQL: triggeringEvent == "Request expiration" >>> lower(f_unaccent(scheduled_notice.jsonb->>'triggeringEvent')) LIKE lower(f_unaccent('Request expiration'))
WARNING: Doing LIKE search without index for jsonb->>'requestId', CQL >>> SQL: requestId == 5a1739e3-e9e2-4fe9-82a2-1c8285252fc9 >>> lower(f_unaccent(jsonb->>'requestId')) LIKE lower(f_unaccent('5a1739e3-e9e2-4fe9-82a2-1c8285252fc9'))
2020-07-01T06:08:38.776Z WARNING: Doing LIKE search without index for  for patron_action_session.jsonb->>'requestIdpatronId', CQL >>> SQL: requestIdpatronId == 5a1739e32c5e835a-e9e2c12d-4fe945b4-82a2a949-1c8285252fc9262c0dc2f65d >>> lower(f_unaccent(patron_action_session.jsonb->>'requestIdpatronId')) LIKE lower(f_unaccent('5a1739e32c5e835a-e9e2c12d-4fe945b4-82a2a949-1c8285252fc9262c0dc2f65d'))
2020-07-01T06:08:38.776Z WARNING: Doing LIKE search without index for patron_action_session.jsonb->>'patronIdactionType', CQL >>> SQL: patronIdactionType == 2c5e835a-c12d-45b4-a949-262c0dc2f65dCheck-in >>> lower(f_unaccent(patron_action_session.jsonb->>'patronIdactionType')) LIKE lower(f_unaccent('2c5e835a-c12d-45b4-a949-262c0dc2f65dCheck-in'))

Database Slow queries 
Anchor
slowQueries
slowQueries

Slowest queries which took the most of execution time were initiated by the mod-inventory-storage and mod_circulation_storage services presented in the following table:


Percent of total time

Average Time,ms

Calls

Module

Query

49%39 ms39,233mod_inventory_storage

SELECTCOUNT(*) FROM (SELECT jsonb,idFROM fs09000000_mod_inventory_storage.item WHERElower(f_unaccent(item.jsonb->>$1)) LIKElower(f_unaccent($2)) LIMIT $3) x

E.x.

SELECT COUNT(*) FROM (SELECT jsonb,id FROM fs09000000_mod_inventory_storage.item WHERE  lower(f_unaccent(item.jsonb->>'barcode')) LIKE lower(f_unaccent('090761167')) LIMIT 1 ) x

48%39 ms39,232mod_inventory_storage

SELECT jsonb,idFROM fs09000000_mod_inventory_storage.item WHERElower(f_unaccent(item.jsonb->>$1)) LIKElower(f_unaccent($2)) LIMIT $3OFFSET $4

E.x.

SELECT jsonb,idFROM fs09000000_mod_inventory_storage.item WHERE lower(f_unaccent(item.jsonb->>'barcode')) LIKE lower(f_unaccent('090761167')) LIMIT 1 OFFSET 0

0.3%56 ms185mod_circulation_storage

SELECT jsonb,idFROM fs09000000_mod_circulation_storage.loan WHERE (lower(f_unaccent(loan.jsonb->$1->>$2)) LIKElower(f_unaccent($3))) AND (loan.jsonb->>$4 ~ $5) LIMIT $6OFFSET $7

E.x.

SELECT jsonb,idFROM fs09000000_mod_circulation_storage.loan WHERE (lower(f_unaccent(loan.jsonb->'status'->>'name')) LIKE lower(f_unaccent('Open'))) AND (lower(f_unaccent(loan.jsonb->>'itemId')) LIMIT 1 OFFSET 0


...

    • In mod-circulation and okapi 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.
    • The found missing indexes warnings are covered by the stories
    • Jira Legacy
      serverSystem JiraJIRA
      serverId01505d01-b853-3c2e-90f1-ee9b165564fc
      keyCIRCSTORE-215
    • Jira Legacy
      serverSystem JiraJIRA
      columnskey,summary,type,created,updated,due,assignee,reporter,priority,status,resolution
      serverId01505d01-b853-3c2e-90f1-ee9b165564fc
      keyCIRCSTORE-216
    • Have follow-up stories to study the performance of the two APIs that are still taking over 100ms to return to see where performance could improve.
    • Jira Legacy
      serverSystem JiraJIRA
      serverId01505d01-b853-3c2e-90f1-ee9b165564fc
      keyPERF-79
    • Jira Legacy
      serverSystem JiraJIRA
      serverId01505d01-b853-3c2e-90f1-ee9b165564fc
      keyPERF-90

...