You're reading the documentation for an old version of openFHIR. For the latest released version, please have a look at 2.2.1.

Performance

This page summarises the results of performance testing conducted on openFHIR Enterprise 2.0.5. All tests were run under sustained concurrent load using Apache JMeter with 20 threads, a 30-second ramp-up, and 100 iterations per operation type (toFHIR and toOpenEHR). The test dataset covers five mapping domains from the MII KDS profile set: Laborbericht, Fall, Procedure, Medikationsverabreichung, and a mixed set — 95 distinct request payloads per direction.

Note

Detailed breakdown of performance test available at https://open-fhir.com/performance-results

Test matrix

Eight configurations were tested, varying CPU allocation, memory, and database backend:

CPUs

Memory

DB

Mean (ms)

Median (ms)

P90 (ms)

P95 (ms)

2

2 GB

MongoDB

687

391

1 668

2 301

2

2 GB

PostgreSQL

1 365

472

2 682

5 134

4

4 GB

MongoDB

106

28

302

526

4

4 GB

PostgreSQL

238

47

411

841

4

8 GB

MongoDB

55

22

143

230

4

8 GB

PostgreSQL

388

53

801

1 605

8

8 GB

MongoDB

22

12

44

67

8

8 GB

PostgreSQL

34

19

74

112

Throughput and peak load

All scenarios processed 20 000 requests (20 concurrent threads). The table below shows sustained throughput and the peak single-request latency observed during each run.

CPUs

Memory

DB

Throughput (req/s)

Median (ms)

2

2 GB

MongoDB

114.6

391

2

2 GB

PostgreSQL

91.1

472

4

4 GB

MongoDB

123.0

28

4

4 GB

PostgreSQL

107.4

47

4

8 GB

MongoDB

128.3

22

4

8 GB

PostgreSQL

105.7

53

8

8 GB

MongoDB

127.5

12

8

8 GB

PostgreSQL

124.5

19

The highest sustained throughput observed was 128 req/s at 4 CPUs / 8 GB / MongoDB. Adding a further 4 CPUs (8 CPUs total) did not materially increase throughput — it primarily reduced latency, with median dropping from 22 ms to 12 ms. This suggests the engine reaches throughput saturation around 125–128 req/s under the tested 20-thread load profile, and that additional CPUs beyond 4 are better justified by latency SLO requirements than raw throughput.

PostgreSQL configurations consistently cap around 105–107 req/s under 4 CPUs due to higher per-request DB overhead. At 8 CPUs PostgreSQL reaches 124 req/s with a median of 19 ms — on par with MongoDB.

toFHIR vs toOpenEHR breakdown

CPUs

Memory

DB

toFHIR avg (ms)

toOpenEHR avg (ms)

2

2 GB

MongoDB

683

629

2

2 GB

PostgreSQL

1 834

891

4

4 GB

MongoDB

101

103

4

4 GB

PostgreSQL

352

112

4

8 GB

MongoDB

52

53

4

8 GB

PostgreSQL

446

324

8

8 GB

MongoDB

18

21

8

8 GB

PostgreSQL

45

21

Analysis

CPU is the dominant factor. The step from 2 to 4 CPUs delivers the largest single improvement — mean latency drops by roughly 6–7× regardless of database or memory. Moving from 4 to 8 CPUs at the same memory level brings a further 3–5× reduction. Mapping is a CPU-bound workload; adding more cores scales throughput near-linearly up to the tested range.

MongoDB consistently outperforms PostgreSQL. The gap is most pronounced under resource pressure. At 2 CPUs / 2 GB, PostgreSQL mean latency is 2× MongoDB and peak latency reaches 30 s versus 8 s for MongoDB, reflecting connection contention under burst conditions. The gap narrows significantly at 8 CPUs / 8 GB, where both backends converge to similar throughput (~125 req/s) and sub-200 ms peak latencies.

toFHIR and toOpenEHR are comparable under sufficient resources. At 2 CPUs toFHIR runs slower (particularly with PostgreSQL, 1 834 ms vs 891 ms), reflecting its more complex query and transformation path. From 4 CPUs upward with MongoDB both directions converge to within a few milliseconds of each other, indicating the engine itself is no longer the bottleneck.

Recommendations

  • Minimum production configuration: 4 CPUs, 4 GB RAM, MongoDB. Delivers 123 req/s sustained throughput with a 28 ms median latency.

  • Recommended production configuration: 4 CPUs, 8 GB RAM, MongoDB. Adds ~5 req/s throughput and cuts median latency to 22 ms compared to the 4 GB variant, at minimal cost.

  • High-throughput / low-latency deployments: 8 CPUs, 8 GB RAM, MongoDB. P95 drops to 67 ms and median to 12 ms. PostgreSQL is a viable alternative at this resource level if operational constraints require it (median 19 ms, 124 req/s).

  • PostgreSQL requires more resources to reach latency parity with MongoDB. Budget at least 8 CPUs; expect P95 latencies roughly 2–3× higher than MongoDB at 4 CPUs.

  • Avoid 2 CPU deployments under sustained concurrent load. Throughput drops to 91–115 req/s and tail latencies exceed 2 s at P95.