Benchmark
- 1 Overview
- 2 Configurations
- 3 Results
- 3.1 Metrics
- 3.2 Network
- 3.3 Setup
- 3.4 Scenario 1: Basic Navigation (not randomize)
- 3.4.1 Configuration a)
- 3.4.1.1 30/60/10
- 3.4.1.2 40/90/30
- 3.4.1.3 50/120/50
- 3.4.1.4 Postgres Read/Write
- 3.4.2 Configuration b)
- 3.4.2.1 30/60/10
- 3.4.2.2 40/90/30
- 3.4.2.3 50/120/50
- 3.4.2.4 Postgres Read/Write
- 3.4.1 Configuration a)
- 3.5 Scenario 2: Document creation (REST API with automation)
- 3.5.1 Configuration a)
- 3.5.1.1 30/60/10
- 3.5.1.2 40/90/30
- 3.5.1.3 50/120/50
- 3.5.1.4 Postgres Read/Write
- 3.5.1.5 Database info
- 3.5.1 Configuration a)
- 3.6 Result overview
- 3.7 Conclusions
Overview
This benchmark is base-line finding configurations for optimization procedures of Athento ECM (Nuxeo Platform based).
Configurations
Single server
Hardware
Ubuntu 14.04.3 LTS (trusty)
1 x Intel(R) Xeon(R) CPU E5-1630 v3 @ 3.70GHz
64Gb memory
disk SATA 200Gb, cache read: 11641.27 MB/sec, buffered: 56.08 MB/sec
Software
Nuxeo CAP 6.0
Jvm options: JAVA_OPTS=-Xms1024m -Xmx2048m -Dfile.encoding=UTF-8 -Dmail.mime.decodeparameters=true -Djava.util.Arrays.useLegacyMergeSort=true -Xloggc:${nuxeo.log.dir}/gc.log -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps
JMX activated for Monitoring (only for benchmark with debugging for health constants)
ACLOptimization = false (only for benchmark)
Full-indexing = false (only for benchmark)
NX-Quota = true
PostgreSQL
(PostgreSQL) 9.3.9
postgresql-9.2-1002.jdbc4.jar
pg_clt options (changed into postgresql.conf)
default
configuration from Nuxeo benchmark: --effective_cache_size=16GB --shared_buffers=10GB --max_prepared_transactions=128 --work_mem=64MB --maintenance_work_mem=1GB --wal_buffers=24MB --checkpoint_completion_target=0.8 --checkpoint_segments=32 --checkpoint_timeout=15min --default_text_search_config=pg_catalog.french --fsync=off --full_page_writes=off --log_min_duration_statement=80ms --log_rotation_size=100MB --synchronous_commit=off --track_activities=on --track_counts=on --log_line_prefix='%t [%p]: [%l-1] ' --port=5436 --max_connections=64 --random_page_cost=2
Analysis: https://wiki.postgresql.org/wiki/Performance_Analysis_Tools
Tools
JMeter 2.13 to make stress test: GUI & REST (source: )
Memory: -Xms=1g -Xmx=2g
jvisualvm to monitoring JVM
powa (http://dalibo.github.io/powa/) to monitoring PostgreSQL
Results
Metrics
Transactions per second
Throughput transaction vs threads
Hits per second (Req/s)
Response time vs threads
Network
Database server is in the same server, so network latency is inappreciable.
Setup
Number of documents into repository: 800K
Number of users (threads): 30, 40 y 50
Ramp-up time (seconds): 60, 90 y 120
Bucle (iterations): 10, 30, 50
The representation for a configuration in a scenario will be: Users/Rampup/Iterations (i.e. 30/60/10)
Scenario 1: Basic Navigation (not randomize)
Login
Workspace and folder navigation across 3rd level
Open a document into folder
Tab navigation into document: (Summary, Relations, Comments, History)
Logout
Configuration a)
PostgresSQL with pg_ctl options = default
ACL optimization = false
full-text indexation = false
Quota-active = true
30/60/10
Transactions per second | Hits per second | Response time vs Threads |
|---|---|---|
|
|
|
40/90/30
Transactions per second | Hits per second | Response time vs Threads |
|---|---|---|
|
|
|
50/120/50
Transactions per second | Hits per second | Response time vs Threads |
|---|---|---|
|
|
|
Postgres Read/Write
Query per second | Blocks per second |
|---|---|
|
|
Configuration b)
30/60/10
Transactions per second | Hits per second | Response time vs Threads |
|---|---|---|
|
|
|
40/90/30
Transactions per second | Hits per second | Response time vs Threads |
|---|---|---|
|
|
|
50/120/50
Transactions per second | Hits per second | Response time vs Threads |
|---|---|---|
|
|
|
Postgres Read/Write
Query per second | Blocks per second |
|---|---|
|
|
Scenario 2: Document creation (REST API with automation)
Check exists for the benchmark workspace (it creates it only first time)
Create a folder into bench workspace
Create a document into created folder (10 iter)
Attach blob into created document (10 iter)
Fetch create document
Configuration a)
PostgresSQL with pg_ctl options = '--effective_cache_size=16GB --shared_buffers=10GB --max_prepared_transactions=128 --work_mem=64MB --maintenance_work_mem=1GB --wal_buffers=24MB --checkpoint_completion_target=0.8 --checkpoint_segments=32 --checkpoint_timeout=15min --default_text_search_config=pg_catalog.spanish --fsync=off --full_page_writes=off --log_min_duration_statement=80ms --log_rotation_size=100MB --synchronous_commit=off --track_activities=on --track_counts=on --log_line_prefix='%t [%p]: [%l-1] ' --port=5436 --max_connections=64 --random_page_cost=2'
ACL optimization = false
full-text indexation = false
Quota-active = false
NOTE: Memory problems detected. GC overhead limit exceeded. So, decision to increased to -xms2g and -xmx4g
NOTE: Detected several thread-workers running for Quota process, which may be cause of GC overhead exceeded detected.
NOTE: Detected problem with Too many open files exception. Solved with: https://doc.nuxeo.com/display/KB/java.net.SocketException+Too+many+open+files
NOTE: In 50/120/50 test, benchmark detects vcs pool is fully used. Solved with change pool to 100 into db and vcs values, with 450 threads in server.xml in HTTP connector.
30/60/10
Transactions per second | Transaction throughput vs Threads | Hits per second | Response time vs Threads |
|---|---|---|---|
40/90/30
Transactions per second | Transaction throughput vs Threads | Hits per second | Response time vs Threads |
|---|---|---|---|
50/120/50
Transactions per second | Transaction throughput vs Threads | Hits per second | Response time vs Threads |
|---|---|---|---|
Postgres Read/Write
Query per second | Blocks per second |
|---|---|
Database info
Inserts (sorted by number of calls) | First hard selects (sorted by avg. runtime) |
|---|---|
Result overview
Max transactions = 80/s
Max throughput = 480transactions/s
Injecting documents per second (Create document + Attach blob)
Max hits (GUI) = 1000req/s
Max hits (API) = 220req/s
Max concurrent users to achieve high performance: ~100
Conclusions
Import documents:
Before:
Check memory, pool and threads into nuxeo.conf and server.xml.nxftl.
Tune PostgreSQL server into postgresql.conf file with scenario parameters.
Disable ACL optimization
Disable fulltext indexing into repository
Uninstall plugin quota (if it is enabled and installed)
Tools recommendations
After:
Enable ACL optimization
Execute: SELECT nx_rebuild_read_acls();
Enable fulltext-indexing into repository
Install and enable plugin quota, if it is necessary.