A dedicated server or a virtual server

These are my notes on choosing between Hetzner's Dedicated Server EQ 4 and Virtual Private Server VQ 19. This was written in 2011 so this may not reflect the current similarities and differences between the two server types.

I've been running catza.net on Hetzner's dedicated server EQ 4 and have been very satisfied with the server and the service. EQ 4 offers plenty of CPU power, memory and disk and has a low price tag. I've had no issues. But there were several factors that made me thinking of downgrading to a VPS:

  • Hetzner has started to offer some interesting VPS's (vServer). I was interested in VQ 19.
  • I used a VPS before EQ 4 and it worked fine so I generally have nothing against the idea of a VPS.
  • I checked my service's usage statistics against the specs of both EQ 4 and VQ 19 and it should run fine on both. The service is not a high traffic service and the technical architecture is lightweight including a multi-level caching scheme. It requires some RAM but with that should run smoothly even on a VPS.
  • My service provides no income but I pay all the fees. The monthly fee is a factor and a VPS generally costs less than a Dedi.
  • Running a dedicated server when VPS is enough is a waste of natural resources and a form of consumerism.

While reading this comparison please keep in mind that we are talking about cheap servers intended for small scale use. When I write things like excellent performance and fast disk IO they should be interpreted the server level in mind. The enterprise stuff is a different story. At my day job we have ordered a database server that can run disk IO at level of 4 gigabytes per second (approximately 40 gigabits per second). As you might quess the server is not Hetzner's EQ or VQ series.

Here are the main features found in EQ 4 and VQ 19 with my comments. Notice that the features listed reflect the Hetzner's offerings as of 2011-07-24.

Feature Hetzner EQ 4 Hetzner VQ 19 My comments
Price per month 49 euros (has a setup fee) 19 euros (no setup fee) Both are cheap compared to the specs and Hetzner's good reputation. But this whole comparison is really not fair since EQ costs 2,5 times the VQ. VQ's lower price is very tempting.
Traffic included (if exceeded the network connection is switched to a slower one) 10 TB 4 TB 10 TB is much more than I need and it is very unlikely that I would hit the 4 TB limit. So this is not a deciding factor for me.
RAM 8 GB 2 GB So both are fine for me. 8 GB is a huge space and due to disk buffering EQ 4 mostly servers my content from RAM. 2 GB is enough to run catza.net even when on a high load.
Disk space 750 GB software mirrored 80 GB on some sort of RAID 80 GB is enough to fit the system, the service, the content and a couple of copies of them. Both have a some sort for RAID protection.
Backup space 100 GB included none This is a strong point to choose EQ 4 instead of VQ 19. I have lot of photo content and it cannot be uploaded from home (limited uplink) or when on travel (3G) in a reasonable time. With VQ 19 I would need to use Amazon's S3 or similar internet storage solution and this adds to the price tag.
CPU Intel i7-920 4 cores Single virtual core Intel i7 makes catza.net fly. Single virtual core is sufficient since it is a guaranteed share (not dependent on other VPS's that run on the same host).
Management Full control. Feature-rich management robot including monitoring and rescue features. Multiple OS images available. Full control. Feature-rich management robot including monitoring and rescue features. Multiple OS images available. The services offer similar management features and freedom of configuration.
The hardware Consumer-grade components. Consumer-grade components. Nothing special here. With these price tags do not expect to get enterprise class hardware. For us not running an enterprise consumer-grade hardware gives the best performance compared to the price. I'd bet that in practice four VQ 19's run on a single EQ class server.

I had a day to spare so I ordered VQ 19. The setup process seems to be automatic since I ordered it the middle of the night during a weekend and during a holiday season and it was up and running in 15 minutes. Then I installed Debian 64 bit minimal, configured the system and shipped the whole catza.net from EQ's backup space.

The test results are pretty much as I expected. VQ 19 has an excellent CPU performance and an adequate IO performance. EQ of course beats VQ in numbers. But in practice considering my application I'd say the difference in small.

My application's unit tests complete in 153 wall clock seconds with EQ 4 and in 193 wall clock seconds with VQ 19.

Disk performance testing with dd is a crude method. Yes it gives some performance figures but the load don't match a typical web application.

Using big block sizes show rather weak results for VQ 19. I'd say that these are just benchmark numbers. The tests with smaller block sizes are closer to real life and there VQ 19 performs adequately.

My application should run fine on VQ 19. EQ 4 offers more IO power. But if you have something really IO demanding maybe the standard EQ disk system is not enough for you.

the test EQ 4 VQ 19
nice dd if=/dev/zero of=test bs=2M count=2000 4194304000 bytes (4.2 GB) copied, 30.1258 s, 139 MB/s 4194304000 bytes (4.2 GB) copied, 241.968 s, 17.3 MB/s
dd if=/dev/zero of=test bs=2M count=2000 4194304000 bytes (4.2 GB) copied, 32.5151 s, 129 MB/s 4194304000 bytes (4.2 GB) copied, 298.434 s, 14.1 MB/s
dd if=/dev/zero of=test bs=385K count=7000 2759680000 bytes (2.8 GB) copied, 13.7199 s, 201 MB/s 2759680000 bytes (2.8 GB) copied, 149.822 s, 18.4 MB/s
dd if=/dev/zero of=test bs=64k count=16k conv=fdatasync 1073741824 bytes (1.1 GB) copied, 11.4975 s, 93.4 MB/s 1073741824 bytes (1.1 GB) copied, 30.2424 s, 35.5 MB/s
dd if=/dev/zero of=test bs=32k count=32k 1073741824 bytes (1.1 GB) copied, 1.06718 s, 1.0 GB/s 1073741824 bytes (1.1 GB) copied, 19.782 s, 54.3 MB/s
hdparm -t on root 332 MB in 3.00 seconds = 110.54 MB/sec 76 MB in 3.41 seconds = 22.31 MB/sec

EQ 4 is CPU-vice a high performance server. VQ 19 shows excellent results too matching the EQ's single core results.

EQ 4

========================================================================
   BYTE UNIX Benchmarks (Version 5.1.3)

   System: Catz: GNU/Linux
   OS: GNU/Linux -- 2.6.32-5-amd64 -- #1 SMP Tue Jun 14 09:42:28 UTC 2011
   Machine: x86_64 (unknown)
   Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
   CPU 0: Intel(R) Core(TM) i7 CPU 920 @ 2.67GHz (5346.9 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 1: Intel(R) Core(TM) i7 CPU 920 @ 2.67GHz (5346.3 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 2: Intel(R) Core(TM) i7 CPU 920 @ 2.67GHz (5346.3 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 3: Intel(R) Core(TM) i7 CPU 920 @ 2.67GHz (5346.3 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 4: Intel(R) Core(TM) i7 CPU 920 @ 2.67GHz (5346.3 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 5: Intel(R) Core(TM) i7 CPU 920 @ 2.67GHz (5346.3 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 6: Intel(R) Core(TM) i7 CPU 920 @ 2.67GHz (5346.3 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   CPU 7: Intel(R) Core(TM) i7 CPU 920 @ 2.67GHz (5346.3 bogomips)
          Hyper-Threading, x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET, Intel virtualization
   12:47:28 up 19 days,  9:58,  2 users,  load average: 0.00, 0.04, 0.08; runlevel

------------------------------------------------------------------------
Benchmark Run: Sun Jul 24 2011 12:47:28 - 13:15:49
8 CPUs in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       27380319.9 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     3514.0 MWIPS (10.0 s, 7 samples)
Execl Throughput                               2350.5 lps   (29.8 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        997464.6 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          275827.6 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       2008339.0 KBps  (30.0 s, 2 samples)
Pipe Throughput                             2389575.4 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 111529.9 lps   (10.0 s, 7 samples)
Process Creation                               9869.8 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   5207.8 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   3838.8 lpm   (60.0 s, 2 samples)
System Call Overhead                        4065280.4 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   27380319.9   2346.2
Double-Precision Whetstone                       55.0       3514.0    638.9
Execl Throughput                                 43.0       2350.5    546.6
File Copy 1024 bufsize 2000 maxblocks          3960.0     997464.6   2518.8
File Copy 256 bufsize 500 maxblocks            1655.0     275827.6   1666.6
File Copy 4096 bufsize 8000 maxblocks          5800.0    2008339.0   3462.7
Pipe Throughput                               12440.0    2389575.4   1920.9
Pipe-based Context Switching                   4000.0     111529.9    278.8
Process Creation                                126.0       9869.8    783.3
Shell Scripts (1 concurrent)                     42.4       5207.8   1228.3
Shell Scripts (8 concurrent)                      6.0       3838.8   6397.9
System Call Overhead                          15000.0    4065280.4   2710.2
                                                                   ========
System Benchmarks Index Score                                        1475.4

------------------------------------------------------------------------
Benchmark Run: Sun Jul 24 2011 13:15:49 - 13:44:22
8 CPUs in system; running 8 parallel copies of tests

Dhrystone 2 using register variables      118476442.5 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                    22621.1 MWIPS (9.9 s, 7 samples)
Execl Throughput                              25881.9 lps   (29.8 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        770590.3 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          207984.5 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       1917802.5 KBps  (30.0 s, 2 samples)
Pipe Throughput                            10128644.1 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                2158629.6 lps   (10.0 s, 7 samples)
Process Creation                              78972.4 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                  37648.5 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                   4931.6 lpm   (60.0 s, 2 samples)
System Call Overhead                       13513932.8 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0  118476442.5  10152.2
Double-Precision Whetstone                       55.0      22621.1   4112.9
Execl Throughput                                 43.0      25881.9   6019.0
File Copy 1024 bufsize 2000 maxblocks          3960.0     770590.3   1945.9
File Copy 256 bufsize 500 maxblocks            1655.0     207984.5   1256.7
File Copy 4096 bufsize 8000 maxblocks          5800.0    1917802.5   3306.6
Pipe Throughput                               12440.0   10128644.1   8142.0
Pipe-based Context Switching                   4000.0    2158629.6   5396.6
Process Creation                                126.0      78972.4   6267.7
Shell Scripts (1 concurrent)                     42.4      37648.5   8879.4
Shell Scripts (8 concurrent)                      6.0       4931.6   8219.3
System Call Overhead                          15000.0   13513932.8   9009.3
                                                                   ========
System Benchmarks Index Score                                        5173.9

VQ 19

========================================================================
   BYTE UNIX Benchmarks (Version 5.1.3)

   System: catz: GNU/Linux
   OS: GNU/Linux -- 2.6.32-5-amd64 -- #1 SMP Tue Jun 14 09:42:28 UTC 2011
   Machine: x86_64 (unknown)
   Language: en_US.utf8 (charmap="UTF-8", collate="UTF-8")
   CPU 0: QEMU Virtual CPU version 0.12.3 (5614.1 bogomips)
          x86-64, MMX, Physical Address Ext, SYSENTER/SYSEXIT, SYSCALL/SYSRET
   12:49:25 up  9:35,  2 users,  load average: 0.00, 0.07, 0.63; runlevel

------------------------------------------------------------------------
Benchmark Run: Sun Jul 24 2011 12:49:25 - 13:17:39
1 CPU in system; running 1 parallel copy of tests

Dhrystone 2 using register variables       24018510.7 lps   (10.0 s, 7 samples)
Double-Precision Whetstone                     3249.5 MWIPS (9.6 s, 7 samples)
Execl Throughput                               3626.4 lps   (30.0 s, 2 samples)
File Copy 1024 bufsize 2000 maxblocks        869488.0 KBps  (30.0 s, 2 samples)
File Copy 256 bufsize 500 maxblocks          281563.1 KBps  (30.0 s, 2 samples)
File Copy 4096 bufsize 8000 maxblocks       1935461.3 KBps  (30.0 s, 2 samples)
Pipe Throughput                             2321830.6 lps   (10.0 s, 7 samples)
Pipe-based Context Switching                 402036.6 lps   (10.0 s, 7 samples)
Process Creation                              14754.2 lps   (30.0 s, 2 samples)
Shell Scripts (1 concurrent)                   6023.6 lpm   (60.0 s, 2 samples)
Shell Scripts (8 concurrent)                    753.1 lpm   (60.0 s, 2 samples)
System Call Overhead                        3682241.3 lps   (10.0 s, 7 samples)

System Benchmarks Index Values               BASELINE       RESULT    INDEX
Dhrystone 2 using register variables         116700.0   24018510.7   2058.1
Double-Precision Whetstone                       55.0       3249.5    590.8
Execl Throughput                                 43.0       3626.4    843.3
File Copy 1024 bufsize 2000 maxblocks          3960.0     869488.0   2195.7
File Copy 256 bufsize 500 maxblocks            1655.0     281563.1   1701.3
File Copy 4096 bufsize 8000 maxblocks          5800.0    1935461.3   3337.0
Pipe Throughput                               12440.0    2321830.6   1866.4
Pipe-based Context Switching                   4000.0     402036.6   1005.1
Process Creation                                126.0      14754.2   1171.0
Shell Scripts (1 concurrent)                     42.4       6023.6   1420.7
Shell Scripts (8 concurrent)                      6.0        753.1   1255.2
System Call Overhead                          15000.0    3682241.3   2454.8
                                                                   ========
System Benchmarks Index Score                                        1493.3

Apache ab was used with a typical catza.net page that is of dynamic nature but due to multi-level caching is served from Memcached without any disk IO.

With my application both servers scale very well. EQ 4's scalability seems astronomical. A scenario causing lots of disk IO (especially writes) would be interesting. It should widen the performance gap between EQ 4 and VQ 19 seen in these results.

EQ 4

From a remote host in Finland: ab -n 300 -c 10 …

Concurrency Level:      10
Time taken for tests:   18.275 seconds
Complete requests:      300
Failed requests:        0
Write errors:           0
Total transferred:      4450500 bytes
HTML transferred:       4350900 bytes
Requests per second:    16.42 [#/sec] (mean)
Time per request:       609.168 [ms] (mean)
Time per request:       60.917 [ms] (mean, across all concurrent requests)
Transfer rate:          237.82 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       55   60   3.8     59      84
Processing:   178  536  49.7    541     581
Waiting:       60  292 130.7    296     562
Total:        240  596  49.6    601     642

Percentage of the requests served within a certain time (ms)
  50%    601
  66%    607
  75%    611
  80%    614
  90%    618
  95%    623
  98%    634
  99%    637
 100%    642 (longest request)

From another Hetzner server: ab -n 1000 -c 10 …

Concurrency Level:      10
Time taken for tests:   1.856 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Total transferred:      14786000 bytes
HTML transferred:       14454000 bytes
Requests per second:    538.73 [#/sec] (mean)
Time per request:       18.562 [ms] (mean)
Time per request:       1.856 [ms] (mean, across all concurrent requests)
Transfer rate:          7778.96 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    3   1.7      3      20
Processing:     4   15   5.3     16      33
Waiting:        0   11   5.0     10      31
Total:          5   18   4.8     18      35

Percentage of the requests served within a certain time (ms)
  50%     18
  66%     20
  75%     22
  80%     22
  90%     24
  95%     26
  98%     28
  99%     30
 100%     35 (longest request)

From another Hetzner server: ab -n 2000 -c 20 …

Concurrency Level:      20
Time taken for tests:   3.187 seconds
Complete requests:      2000
Failed requests:        0
Write errors:           0
Total transferred:      29572000 bytes
HTML transferred:       28908000 bytes
Requests per second:    627.59 [#/sec] (mean)
Time per request:       31.868 [ms] (mean)
Time per request:       1.593 [ms] (mean, across all concurrent requests)
Transfer rate:          9062.01 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    6   3.9      6      26
Processing:     6   25   9.6     24      72
Waiting:        2   16   8.0     14      69
Total:         12   31   8.3     31      78

Percentage of the requests served within a certain time (ms)
  50%     31
  66%     34
  75%     36
  80%     37
  90%     40
  95%     43
  98%     48
  99%     73
 100%     78 (longest request)

From another Hetzner server: ab -n 2000 -c 100 …

Concurrency Level:      100
Time taken for tests:   3.135 seconds
Complete requests:      2000
Failed requests:        0
Write errors:           0
Total transferred:      29572000 bytes
HTML transferred:       28908000 bytes
Requests per second:    637.86 [#/sec] (mean)
Time per request:       156.773 [ms] (mean)
Time per request:       1.568 [ms] (mean, across all concurrent requests)
Transfer rate:          9210.42 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0   34  15.8     33      87
Processing:    10   91  39.3     89     341
Waiting:        7   51  26.6     48     266
Total:         29  125  44.1    127     390

Percentage of the requests served within a certain time (ms)
  50%    127
  66%    141
  75%    150
  80%    154
  90%    168
  95%    179
  98%    216
  99%    301
 100%    390 (longest request)

From the same server: ab -n 2000 -c 100 …

Concurrency Level:      100
Time taken for tests:   1.242 seconds
Complete requests:      2000
Failed requests:        0
Write errors:           0
Total transferred:      29572000 bytes
HTML transferred:       28908000 bytes
Requests per second:    1609.87 [#/sec] (mean)
Time per request:       62.117 [ms] (mean)
Time per request:       0.621 [ms] (mean, across all concurrent requests)
Transfer rate:          23245.69 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.8      0       6
Processing:     7   60   8.8     61      80
Waiting:        7   60   8.8     60      80
Total:         12   61   8.2     61      80

Percentage of the requests served within a certain time (ms)
  50%     61
  66%     62
  75%     64
  80%     64
  90%     68
  95%     72
  98%     75
  99%     78
 100%     80 (longest request)

From the same server: ab -n 50000 -c 500 …

Concurrency Level:      500
Time taken for tests:   43.283 seconds
Complete requests:      50000
Failed requests:        793
   (Connect: 0, Receive: 0, Length: 793, Exceptions: 0)
Write errors:           0
Non-2xx responses:      793
Total transferred:      727832890 bytes
HTML transferred:       711377326 bytes
Requests per second:    1155.18 [#/sec] (mean)
Time per request:       432.835 [ms] (mean)
Time per request:       0.866 [ms] (mean, across all concurrent requests)
Transfer rate:          16421.37 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   1.2      0      16
Processing:     9  316 1466.0     80   33017
Waiting:        9  316 1465.9     80   33017
Total:         25  317 1466.4     80   33027

Percentage of the requests served within a certain time (ms)
  50%     80
  66%     84
  75%     87
  80%     89
  90%    103
  95%    123
  98%   5000
  99%   5008
 100%  33027 (longest request)

VQ 19

From a remote host in Finland: ab -n 300 -c 10 …

Concurrency Level:      10
Time taken for tests:   19.739 seconds
Complete requests:      300
Failed requests:        0
Write errors:           0
Total transferred:      4450500 bytes
HTML transferred:       4350900 bytes
Requests per second:    15.20 [#/sec] (mean)
Time per request:       657.971 [ms] (mean)
Time per request:       65.797 [ms] (mean, across all concurrent requests)
Transfer rate:          220.18 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       56   65  13.3     61     161
Processing:   176  579  93.3    562     975
Waiting:       61  326 153.6    310     909
Total:        235  643  99.5    626    1036

Percentage of the requests served within a certain time (ms)
  50%    626
  66%    645
  75%    654
  80%    657
  90%    693
  95%    860
  98%    975
  99%   1026
 100%   1036 (longest request)

From another Hetzner server: ab -n 1000 -c 10 …

Concurrency Level:      10
Time taken for tests:   19.916 seconds
Complete requests:      1000
Failed requests:        4
   (Connect: 0, Receive: 0, Length: 4, Exceptions: 0)
Write errors:           0
Non-2xx responses:      1
Total transferred:      14773515 bytes
HTML transferred:       14441702 bytes
Requests per second:    50.21 [#/sec] (mean)
Time per request:       199.161 [ms] (mean)
Time per request:       19.916 [ms] (mean, across all concurrent requests)
Transfer rate:          724.40 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   0.6      0       9
Processing:     4  199 1408.9     45   14391
Waiting:        3  188 1408.7     35   14389
Total:          5  199 1408.9     46   14391
WARNING: The median and mean for the initial connection time are not within a normal deviation
        These results are probably not that reliable.

Percentage of the requests served within a certain time (ms)
  50%     46
  66%     60
  75%     71
  80%     81
  90%    111
  95%    140
  98%    248
  99%  13440
 100%  14391 (longest request)

From another Hetzner server: ab -n 2000 -c 20 …

Concurrency Level:      20
Time taken for tests:   9.023 seconds
Complete requests:      2000
Failed requests:        0
Write errors:           0
Total transferred:      29576000 bytes
HTML transferred:       28912000 bytes
Requests per second:    221.66 [#/sec] (mean)
Time per request:       90.227 [ms] (mean)
Time per request:       4.511 [ms] (mean, across all concurrent requests)
Transfer rate:          3201.12 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   0.5      0      19
Processing:     4   89  48.6     85     262
Waiting:        3   67  38.4     62     227
Total:          5   90  48.7     86     262
WARNING: The median and mean for the initial connection time are not within a normal deviation
        These results are probably not that reliable.

Percentage of the requests served within a certain time (ms)
  50%     86
  66%    106
  75%    121
  80%    131
  90%    157
  95%    180
  98%    203
  99%    218
 100%    262 (longest request)

From another Hetzner server: ab -n 2000 -c 100 …

Concurrency Level:      100
Time taken for tests:   9.621 seconds
Complete requests:      2000
Failed requests:        0
Write errors:           0
Total transferred:      29576000 bytes
HTML transferred:       28912000 bytes
Requests per second:    207.87 [#/sec] (mean)
Time per request:       481.065 [ms] (mean)
Time per request:       4.811 [ms] (mean, across all concurrent requests)
Transfer rate:          3001.97 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0   55 399.0      0    3004
Processing:    20  422 224.3    374    1386
Waiting:       12  315 165.0    276    1120
Total:         20  477 524.8    376    4389

Percentage of the requests served within a certain time (ms)
  50%    376
  66%    458
  75%    526
  80%    600
  90%    726
  95%    830
  98%   1263
  99%   3994
 100%   4389 (longest request)

From the same server: ab -n 2000 -c 100 …

Concurrency Level:      100
Time taken for tests:   9.145 seconds
Complete requests:      2000
Failed requests:        0
Write errors:           0
Total transferred:      29576000 bytes
HTML transferred:       28912000 bytes
Requests per second:    218.70 [#/sec] (mean)
Time per request:       457.243 [ms] (mean)
Time per request:       4.572 [ms] (mean, across all concurrent requests)
Transfer rate:          3158.37 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    3  13.6      0     339
Processing:    18  447 283.2    344    1494
Waiting:        3  444 283.0    341    1494
Total:         55  451 281.3    345    1494

Percentage of the requests served within a certain time (ms)
  50%    345
  66%    378
  75%    468
  80%    548
  90%    827
  95%   1356
  98%   1434
  99%   1441
 100%   1494 (longest request)

From the same server: ab -n 50000 -c 500 …

Concurrency Level:      500
Time taken for tests:   154.968 seconds
Complete requests:      50000
Failed requests:        3040
   (Connect: 0, Receive: 0, Length: 3040, Exceptions: 0)
Write errors:           0
Non-2xx responses:      3040
Total transferred:      695434200 bytes
HTML transferred:       679387920 bytes
Requests per second:    322.65 [#/sec] (mean)
Time per request:       1549.676 [ms] (mean)
Time per request:       3.099 [ms] (mean, across all concurrent requests)
Transfer rate:          4382.43 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    1   9.3      0     120
Processing:     0 1482 2226.2    439   33053
Waiting:        0 1479 2225.5    436   33053
Total:          0 1483 2229.7    439   33157

Percentage of the requests served within a certain time (ms)
  50%    439
  66%    537
  75%   3362
  80%   3406
  90%   3575
  95%   5002
  98%   6579
  99%   9209
 100%  33157 (longest request)

VQ 19 appears to be very suitable to run catza.net without performance issues. I would save 30 euros per month if switching to it. Still I decided to keep EQ 4 and let VQ 19 go for several reasons:

  • VQ 19 is a single core server. While the core performs excellent the single core solution has its potential to become a bottleneck. When I run unit tests the CPU is fully consumed. When I check database integrity the CPU is fully consumed. When I make a backup the CPU is fully consumed (encryption, compression). If a Linux process hangs the CPU is fully consumed. These situations have an immediate effect on the application performance. With EQ 4 I can run my tasks, have a hung process and there are still two cores left to serve the web users. I sleep my nights better with multiple cores. I wonder if Hetzner could update the VQ's to have one quaranteed core, four burstable cores?
  • Since the application is lightweight VQ 19 could handle all the load catza.net is due to face. But EQ 4 offers more headroom for unforeseen situations, extreme peak times and future expansion. I serve photos and the photos get inline linked around the web. I don't mind since I have plenty of headroom for that.
  • VQ 19 has no backup space. EQ 4 has and it works fine (have tried both making backups and restoring them). External backup space adds to VQ 19's price.
  • For a casual web service admin VQ 19 is a Mercedes Benz. EQ 4 is a Rolls-Royce.