diff --git a/docs/performance/theoretical.en.md b/docs/performance/theoretical.en.md index 043bd7ea..b85d0a43 100644 --- a/docs/performance/theoretical.en.md +++ b/docs/performance/theoretical.en.md @@ -11,19 +11,26 @@ Replicated setups: - Single-threaded write+fsync latency: - With immediate commit: 2 network roundtrips + 1 disk write. - With lazy commit: 4 network roundtrips + 1 disk write + 1 disk flush. -- Saturated parallel read iops: min(network bandwidth, sum(disk read iops)). -- Saturated parallel write iops: min(network bandwidth, sum(disk write iops / number of replicas / write amplification)). +- Linear read: `min(total network bandwidth, sum(disk read MB/s))`. +- Linear write: `min(total network bandwidth, sum(disk write MB/s / number of replicas))`. +- Saturated parallel read iops: `min(total network bandwidth, sum(disk read iops))`. +- Saturated parallel write iops: `min(total network bandwidth / number of replicas, sum(disk write iops / number of replicas / (write amplification = 4)))`. -EC/XOR setups: +EC/XOR setups (EC N+K): - Single-threaded (T1Q1) read latency: 1.5 network roundtrips + 1 disk read. - Single-threaded write+fsync latency: - With immediate commit: 3.5 network roundtrips + 1 disk read + 2 disk writes. - With lazy commit: 5.5 network roundtrips + 1 disk read + 2 disk writes + 2 disk fsyncs. - - 0.5 in actually (k-1)/k which means that an additional roundtrip doesn't happen when + - 0.5 in actually `(N-1)/N` which means that an additional roundtrip doesn't happen when the read sub-operation can be served locally. -- Saturated parallel read iops: min(network bandwidth, sum(disk read iops)). -- Saturated parallel write iops: min(network bandwidth, sum(disk write iops * number of data drives / (number of data + parity drives) / write amplification)). - In fact, you should put disk write iops under the condition of ~10% reads / ~90% writes in this formula. +- Linear read: `min(total network bandwidth, sum(disk read MB/s))`. +- Linear write: `min(total network bandwidth, sum(disk write MB/s * N/(N+K)))`. +- Saturated parallel read iops: `min(total network bandwidth, sum(disk read iops))`. +- Saturated parallel write iops: roughly `total iops / (N+K) / WA`. More exactly, + `min(total network bandwidth * N/(N+K), sum(disk randrw iops / (N*4 + K*5 + 1)))` with + random read/write mix corresponding to `(N-1)/(N*4 + K*5 + 1)*100 % reads`. + - For example, with EC 2+1 it is: `(7% randrw iops) / 14`. + - With EC 6+3 it is: `(12.5% randrw iops) / 40`. Write amplification for 4 KB blocks is usually 3-5 in Vitastor: 1. Journal block write diff --git a/docs/performance/theoretical.ru.md b/docs/performance/theoretical.ru.md index e32c27d3..d258545a 100644 --- a/docs/performance/theoretical.ru.md +++ b/docs/performance/theoretical.ru.md @@ -11,20 +11,27 @@ - Запись+fsync в 1 поток: - С мгновенным сбросом: 2 RTT + 1 запись. - С отложенным ("ленивым") сбросом: 4 RTT + 1 запись + 1 fsync. -- Параллельное чтение: сумма IOPS всех дисков либо производительность сети, если в сеть упрётся раньше. -- Параллельная запись: сумма IOPS всех дисков / число реплик / WA либо производительность сети, если в сеть упрётся раньше. +- Линейное чтение: сумма МБ/с чтения всех дисков, либо общая производительность сети (сумма пропускной способности сети всех нод), если в сеть упрётся раньше. +- Линейная запись: сумма МБ/с записи всех дисков / число реплик, либо производительность сети / число реплик, если в сеть упрётся раньше. +- Параллельное случайное мелкое чтение: сумма IOPS чтения всех дисков, либо производительность сети, если в сеть упрётся раньше. +- Параллельная случайная мелкая запись: сумма IOPS записи всех дисков / число реплик / WA, либо производительность сети / число реплик, если в сеть упрётся раньше. -При использовании кодов коррекции ошибок (EC): +При использовании кодов коррекции ошибок (EC N+K): - Задержка чтения в 1 поток (T1Q1): 1.5 RTT + 1 чтение. - Запись+fsync в 1 поток: - С мгновенным сбросом: 3.5 RTT + 1 чтение + 2 записи. - С отложенным ("ленивым") сбросом: 5.5 RTT + 1 чтение + 2 записи + 2 fsync. -- Под 0.5 на самом деле подразумевается (k-1)/k, где k - число дисков данных, +- Под 0.5 на самом деле подразумевается (N-1)/N, где N - число дисков данных, что означает, что дополнительное обращение по сети не нужно, когда операция чтения обслуживается локально. -- Параллельное чтение: сумма IOPS всех дисков либо производительность сети, если в сеть упрётся раньше. -- Параллельная запись: сумма IOPS всех дисков / общее число дисков данных и чётности / WA либо производительность сети, если в сеть упрётся раньше. - Примечание: IOPS дисков в данном случае надо брать в смешанном режиме чтения/записи в пропорции, аналогичной формулам выше. +- Линейное чтение: сумма МБ/с чтения всех дисков, либо общая производительность сети, если в сеть упрётся раньше. +- Линейная запись: сумма МБ/с записи всех дисков * N/(N+K), либо производительность сети * N / (N+K), если в сеть упрётся раньше. +- Параллельное случайное мелкое чтение: сумма IOPS чтения всех дисков либо производительность сети, если в сеть упрётся раньше. +- Параллельная случайная мелкая запись: грубо `(сумма IOPS / (N+K) / WA)`. Если точнее, то: + сумма смешанного IOPS всех дисков при `(N-1)/(N*4 + K*5 + 1)*100 %` чтения, делённая на `(N*4 + K*5 + 1)`. + Либо, производительность сети * N/(N+K), если в сеть упрётся раньше. + - Например, при EC 2+1 это: `(сумма IOPS при 7% чтения) / 14`. + - При EC 6+3 это: `(сумма IOPS при 12.5% чтения) / 40`. WA (мультипликатор записи) для 4 КБ блоков в Vitastor обычно составляет 3-5: 1. Запись метаданных в журнал