Skip to content

Instantly share code, notes, and snippets.

@yorickdowne
Last active December 3, 2023 14:34
Star You must be signed in to star a gist
Embed
What would you like to do?
Great and less great SSDs for Ethereum nodes

Overview

Syncing an Ethereum node is largely reliant on IOPS, I/O Per Second. Budget SSDs will struggle to an extent, and some won't be able to sync at all.

This document aims to snapshot some known good and known bad models.

For size, 2TB come recommended as of mid-2022. 1TB can work for now but is getting tight.

High-level, QLC and DRAMless are far slower than "mainstream" SSDs.

IOPS wise, it's likely Geth, then Besu, then Nethermind in ascending order of IOPS requirements. I am not quite sure where Erigon fits these days.

Other than a slow SSD model, these are things that can slow IOPS down:

  • Heat. Check with smartctl -x; the SSD should be below 50C so it does not throttle.
  • TRIM not being allowed. This can happen with some hardware RAID controllers, as well as on macOS with non-Apple SSDs
  • On SATA, the controller in UEFI/BIOS set to anything other than AHCI. Set it to AHCI for good performance.

If you haven't already, do turn off atime on your DB volume, it'll increase SSD lifetime and speed things up a little bit.

The drive lists are ordered by interface and alphabetically by vendor name, not by preference. The lists are not exhaustive at all. @mwpastore linked a filterable spreadsheet in comments that has a far greater variety of drives and their characteristics.

The Good

"Mainstream" and "Performance" drive models that can sync mainnet execution layer clients in a reasonable amount of time. Use M.2 NVMe if your machine supports it.

Note that in some cases older "Performance" PCIe 4 drives can be bought at a lower price than a PCIe 3 "Mainstream" drive - shop around.

  • Often on sale: Samsung 970 EVO Plus, SK Hynix P31 Gold
  • Higher TBW than most: Seagate Firecuda 530, WD Red SN700
  • Lowest power draw: SK Hynix P31 Gold - great choice for Rock5 B and other low-power devices

We've started crowd-sourcing some IOPS numbers. If you want to join the fun, run fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --filename=test --bs=4k --iodepth=64 --size=150G --readwrite=randrw --rwmixread=75 and give us the read and write IOPS. Don't forget to rm test after.

Hardware

M.2 NVMe "Mainstream" - TLC, DRAM, PCIe 3

  • AData XPG Gammix S11/SX8200 Pro. Several hardware revisions. It's slower than some QLC drives. 68k/22k r/w IOPS
  • AData XPG Gammix S50 Lite
  • HP EX950
  • Mushkin Pilot-E
  • Samsung 970 EVO Plus 2TB, pre-rework (firmware 2B2QEXM7). 140k/46k r/w IOPS
  • Samsung 970 EVO Plus 2TB, post-rework (firmware 3B2QEXM7 or 4B2QEXM7). In testing this syncs just as quickly as the pre-rework drive
  • SK Hynix P31 Gold
  • WD Black SN750 (but not SN750 SE)
  • WD Red SN700

2.5" SATA "Mainstream" - TLC, DRAM

  • Crucial MX500 SATA, 46k/15k r/w IOPS
  • Samsung 860 EVO SATA, 55k/18k r/w IOPS
  • Samsung 870 EVO SATA, 63k/20k r/w IOPS
  • WD Blue 3D NAND SATA

Honorable Pi4 mention:

  • Samsung T5 USB - works but is slow, avoid if at all possible and go for M.2 NVMe instead, with Rock5 B or FxBlox. To clarify: If you stay with Pi4, then T5 USB or USB M.2 NVMe adapter should roughly perform the same. Choose either. Maybe consider going for NVMe and a USB adapter so you can upgrade to a Rock5 B in future.

M.2 NVMe "Performance" - TLC, DRAM, PCIe 4 or 5

  • ADATA XPG Gammix S70
  • Corsair Force MP600 Pro (but not XT)
  • Crucial P5 Plus
  • Kingston KC2000
  • Kingston KC3000. 377k/126k r/w IOPS
  • Kingston Fury Renegade
  • Mushkin Redline Vortex
  • Sabrent Rocket 4 Plus
  • Samsung 980 Pro (not 980) - a firmware update to 5B2QGXA7 is necessary to keep them from dying, if they are firmware 3B2QGXA7. Samsung's boot Linux is a bit broken, you may want to flash from your own Linux.
  • Samsung 990 Pro - there are reports of 990 Pro rapidly losing health. A firmware update to 1B2QJXD7 is meant to stop the rapid degradation, but won't reverse any that happened on earlier firmware.
  • Seagate Firecuda 530, 218k/73k r/w IOPS
  • SK Hynix P41 Platinum / Solidigm P44 Pro
  • WD Black SN850
  • WD Black SN850X, 101k/33k r/w IOPS

Data center SSD drives will also work well.

Cloud

  • Any baremetal/dedicated server service
  • AWS i3en.2xlarge
  • AWS gp3 w/ >=10k IOPS provisioned and an m7i/a.xlarge

The Bad

These "Budget" drive models are reportedly too slow to sync (all) mainnet execution layer clients.

Hardware

  • AData S40G/SX8100 4TB, QLC - the 2TB model is TLC and should be fine; 4TB is reportedly too slow
  • Crucial P1, QLC - users report it can't sync Nethermind
  • Crucial P2 and P3 (Plus), QLC and DRAMless - users report it can't sync Nethermind
  • Kingston NV1 - probably QLC and DRAMless and thus too slow on 2TB, but could be "anything" as Kingston do not guarantee specific components.
  • Kingston NV2 - like NV1 no guaranteed components
  • WD Green SN350, QLC and DRAMless
  • Anything both QLC and DRAMless will likely not be able to sync at all or not be able to consistently keep up with "chain head"
  • Crucial BX500 SATA, HP S650 SATA, probably most SATA budget drives
  • Samsung 980, DRAMless - unsure, this may belong in "Ugly". If you have one and can say for sure, please come to ethstaker Discord.
  • Samsung T7 USB, even with current firmware

The Ugly

"Budget" drive models that reportedly can sync mainnet execution layer clients, if slowly.

Note that QLC drives usually have a markedly lower TBW than TLC, and will fail earlier.

Hardware

  • Corsair MP400, QLC
  • Inland Professional 3D NAND, QLC
  • Intel 660p, QLC. It's faster than some "mainstream" drives. 98k/33k r/w IOPS
  • Seagata Barracuda Q5, QLC
  • WD Black SN770, DRAMless
  • Samsung 870 QVO SATA, QLC

Cloud

  • Contabo SSD - reportedly able to sync Geth 1.13.0 and Nethermind, if slowly
  • Netcup VPS Servers - reportedly able to sync Geth 1.13.0 and Nethermind, if slowly
  • Contabo NVMe - fast enough but not enough space. 800 GiB is not sufficient.
  • Netcup RS Servers. Reportedly fast enough to sync Nethermind or Geth; still no speed demon.
@uniyj
Copy link

uniyj commented Oct 17, 2022

Suggested addition: WD Black SN770 (note: SN750 seems to be its predecessor) also works fine.

@mwpastore
Copy link

mwpastore commented Nov 1, 2022

NewMaxx is a great resource for this stuff, in particular this flowchart, this written guide, and this filterable spreadsheet.

The spreadsheet tends to be the most up-to-date and often gives useful information in the notes, e.g. single- or double-sided, whether some components have been upgraded or downgraded over time a la Samsung 970 EVO+, whether certain capacities are significantly faster or slower, if the 4TB model is QLC even though the other capacities are TLC, etc.

@yorickdowne
Copy link
Author

Thanks for sharing! That sheet is great. Filtering for DRAM yes, TLC, and "2TB/4TB" should do the trick.

@mwpastore
Copy link

mwpastore commented Nov 7, 2022

It's starting to look like write latency and IOPS at QD1 are the most important drive specs. That would explain why e.g. Erigon doesn't sync very quickly even on my SK hynix P41 that can do ~1.3M IOPS at high queue depths and thread counts. It also explains why drives based on QLC NAND tend to be a poor choice (because QLC has absolutely terrible write latency).

EDIT: Actually, the pattern is lots of QD1 reads while assembling the batch, then a big write at a higher queue depth. So read latency and IOPS at QD1 are important, as is the ability of the drive to recover from that big write and resume reading at full speed.

Additionally, it seems like there's a lot of on-disk reorganization happening during syncing. That would explain why we're seeing an extreme rate of fragmentation on ZFS (and probably other CoW filesystems). It also explains why DRAM-less drives tend to be a poor choice (because the FTL can't keep up with the high rate of P/E cycles).

It would be interesting to try syncing with an SSD based on 3D XPoint. I have an older Optane 905p on hand, unfortunately it's only 960GB so I would have to get creative. While Optane is probably cost-prohibitive for most, if it works well it could be feasible to use a smaller Optane drive as a writeback cache for a larger capacity of cheap QLC NAND. That's effectively how Intel's own H10 and H20 products work.

@yorickdowne
Copy link
Author

yorickdowne commented Nov 9, 2022

Erigon in particular is gated by CPU performance, because it does a full sync. I've seen it sync in under 4 days on a machine with a lot of RAM and cores; and take weeks on a more "consumer" setup.

You are absolutely right that there's a lot of reorg. That's because state shifts, and with it the trie shifts. There was an article on how this behaves with Geth. While Erigon has a great many optimizations, it also cannot escape the fundamental nature of Ethereum.

@mwpastore
Copy link

mwpastore commented Nov 14, 2022

I just hit a new personal best, syncing a mainnet full node (not archive) from scratch using Erigon and Lighthouse in roughly 48 hours after downloading snapshots.

  • Erigon 2.30.0: with --externalcl --prune=htcr
  • Lighthouse 3.2.1: with checkpoint sync against my primary Lighthouse instance, without --sync-historic-states
  • CPU: i5-13600K (P-cores only, stock settings)
  • RAM: 32GB DDR4-3200 CL16 CR2 1:1 (Gear 1), no swap
  • OS: Ubuntu Server 22.04.1 LTS
  • Storage:
    • Erigon:
      • snapshots: Samsung 970 EVO+ 2TB
      • temp: Samsung 970 EVO+ 2TB
      • everything else: Intel Optane 905p 960GB
    • Lighthouse: Samsung 970 EVO+ 2TB
    • LVM2, all LVs are linear and formatted with XFS

I think the high IPC of these Raptor Cove P-cores helped a ton, and the 905p was able to keep up with the sustained, high, random read IOPS at low queue depths (up to 11K) toward the end of the initial sync. It was still hitting 36–42 blk/s at block 159* (vs ~20 at the same point on my 5950X and SK hynix P41 2TB). The 905p also seems to be able to transition more quickly between the batch assembly and commit phases—although not much moreso than a high-end Gen4 NAND flash drive like I expected.

What I'll do now is move Erigon's main LV to the 970 EVO+ and repeat the exact same sync. That will help me isolate how much of the speedup is from the Optane drive vs. the rest of the hardware. Specifically, per your notes on CPU performance, I'd like to know the difference between syncing with Raptor Cove vs Zen 3 P-cores.

UPDATE: After ~24 hours I'm at block 127* and already dropping below 40 blk/s. So far at least it seems like the 905p did speed things up measurably on otherwise the same hardware, but it remains to be seen how significantly it affected total sync time.

UPDATE 2: After ~48 hours I'm at block 153* and already dropping below 30 blk/s. The system appears to be I/O-bound per PSI; sustained random read IOPS at low queue depths seems to be peaking around 3.7K on the EVO+, or about a third of what I was seeing on the 905p at roughly the same point in the sync process.

UPDATE 3: It finished syncing last night/overnight and unfortunately I didn't check it before I went to bed and wasn't able to capture the exact time in my tmux scrollback buffer. Based on estimated block speed I would guess between 6⅓ and 9½ hours after the 48 hour mark, plus an hour or two for the remaining phases.

So in conclusion if you're largely I/O-bound as you get into blocks from 2021 and later then yes you could benefit from a drive that features high random read IOPS at low queue depths. In late 2022 that translates to an 8–12 hour speedup (48 hours vs 56–60 hours) with low-end 3D XPoint vs high-end TLC NAND on Raptor Cove. Whether it makes sense to spend hundreds and potentially thousands of dollars more on storage for such a speedup is highly questionable.

The next test would be to see if I can achieve a similar speedup with a smaller allocation of the 905p configured as a writeback cache. That would open up the possibility of pairing a relatively-cheap e.g. P1600X with some less expensive storage.

@mwpastore
Copy link

42 hours with a 110GiB slice of the 905p configured as writeback cache! That exceeds my wildest expectations.

I would still like to play around with writeback vs. writethrough modes but I think my question has been answered: Yes, Optane can significantly speed up the last leg of the initial sync once it's no longer CPU-bound. If you're running on Zen 3 or Golden Cove or newer and want to fully-optimize Erigon re-sync performance, I think it's worth considering.

Newegg has Optane P1600X 118GB drives on sale for $76 a pop. This model doesn't have the absolute best peak specs but it should absolutely destroy QD1 random read. At that price point I will be adding one to my node to complement the two MX500 2TB SATA drives I have in there already.

I'll stop spamming this thread but please let me know if you have questions. Cheers and happy validating!

@yorickdowne
Copy link
Author

Very cool, thanks for all the testing! When you say writeback cache, what exactly is the setup you're using?

@mwpastore
Copy link

mwpastore commented Nov 21, 2022

When you say writeback cache, what exactly is the setup you're using?

LVM2. You create a logical volume, tell LVM2 it's a cache volume, then attach it to another LV. Something like this:

lvcreate -L 110G -n cache_1 vgeth /dev/nvme0n1
lvcreate -L 110M -n cache_1_meta vgeth /dev/nvme0n1
lvconvert --type cache-pool --poolmetadata vgeth/cache_1_meta vgeth/cache_1
lvconvert --type cache --cachepool vgeth/cache_1 --cachemode writeback vgeth/erigon-mainnet

There are easier ways to do it; I use this procedure which includes some extra steps that allow me to optionally put the metadata on a different PV than the data, or use a non-linear topology for the data and/or metadata.

@BvL13
Copy link

BvL13 commented Apr 6, 2023

Awesome list. At @AvadoDServer we switched to the Kingston Fury Renegade with Heatsink for 2, 4, 6, 10, 12 TB Versions

@dreadedhamish
Copy link

Question about testing - using this command:
fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --filename=test --bs=4k --iodepth=64 --size=150G --readwrite=randrw --rwmixread=75
On one drive I'm trouble-shooting this will take 36 hours. I'm unsure of the mechanism of the test - would I need to wait for the test to complete to gain accurate results, or would stopping it after 2 hours give me results that are close enough?

@yorickdowne
Copy link
Author

If it takes that long then that’s a very slow drive. You can absolutely just abandon it and mark the drive as slow.

@c0achmcguirk
Copy link

Thanks for compiling this! Feel free to add this SSD to the ugly:

@eliotstock
Copy link

Crucial P3 Plus 4TB NVMe (listed under The Bad above):

the bad:

sudo fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --filename=test --bs=4k --iodepth=64 --size=150G --readwrite=randrw --rwmixread=75
[sudo] password for e: 
test: (g=0): rw=randrw, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=64
fio-3.28
Starting 1 process
test: Laying out IO file (1 file / 153600MiB)
Jobs: 1 (f=1): [m(1)][100.0%][r=357MiB/s,w=118MiB/s][r=91.3k,w=30.1k IOPS][eta 00m:00s]
test: (groupid=0, jobs=1): err= 0: pid=1655: Mon Jul  3 01:06:08 2023
  read: IOPS=53.4k, BW=209MiB/s (219MB/s)(113GiB/551963msec)
   bw (  KiB/s): min=68280, max=366212, per=100.00%, avg=213805.88, stdev=26898.10, samples=1103
   iops        : min=17070, max=91553, avg=53451.40, stdev=6724.53, samples=1103
  write: IOPS=17.8k, BW=69.6MiB/s (72.9MB/s)(37.5GiB/551963msec); 0 zone resets
   bw (  KiB/s): min=22768, max=119775, per=100.00%, avg=71257.56, stdev=8954.47, samples=1103
   iops        : min= 5692, max=29943, avg=17814.27, stdev=2238.60, samples=1103
  cpu          : usr=11.09%, sys=45.81%, ctx=12177744, majf=2, minf=13
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%
     issued rwts: total=29492326,9829274,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=64

Run status group 0 (all jobs):
   READ: bw=209MiB/s (219MB/s), 209MiB/s-209MiB/s (219MB/s-219MB/s), io=113GiB (121GB), run=551963-551963msec
  WRITE: bw=69.6MiB/s (72.9MB/s), 69.6MiB/s-69.6MiB/s (72.9MB/s-72.9MB/s), io=37.5GiB (40.3GB), run=551963-551963msec

Disk stats (read/write):
  nvme0n1: ios=29480777/9825548, merge=0/110, ticks=28683132/119856, in_queue=28803427, util=100.00%

@Fineas02
Copy link

Fineas02 commented Jul 6, 2023

Is it worth getting a 4TB drive if I'm just starting out? Looking to run a reth node, and I want to future proof.

@yorickdowne
Copy link
Author

Reth requires 4TB at present, as it always syncs an archive node. WD Red SN700 and WD Black SN850(X) are good contenders; there are others.

Once Reth can sync a pruned node, 2TB should work for it, as well.

@Fineas02
Copy link

Fineas02 commented Jul 6, 2023

On their docs it mentions a 2TB for syncing the archive node. Has that turned out to be insufficient? I'm planning on using my SSD with an enclosure and connecting to a MacBook. Is there anything cheaper, or is the SN850X worth the price tag?

@gakonst
Copy link

gakonst commented Jul 6, 2023

The Reth node itself will take ~2TB but it will exceed that soon, and if you're running a CL it'll also take some extra space, so it's generally recommended for your total to be over the 2TB limit so you don't run out of space soon.

@yorickdowne
Copy link
Author

In my testing Reth takes around 2 TiB, which means it exceeds a 2TB drive (around 1.9 TiB) right away.

@valo
Copy link

valo commented Sep 8, 2023

How did you manage to get such IOPS for Seagate Firecuda 530? I am testing a 4TB drive and the IOPS I am getting are 142k/47k:

test: (g=0): rw=randrw, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=64
fio-3.28
Starting 1 process
test: Laying out IO file (1 file / 153600MiB)
Jobs: 1 (f=1): [m(1)][100.0%][r=584MiB/s,w=194MiB/s][r=150k,w=49.6k IOPS][eta 00m:00s]
test: (groupid=0, jobs=1): err= 0: pid=2321: Fri Sep  8 16:46:37 2023
  read: IOPS=142k, BW=556MiB/s (583MB/s)(113GiB/207369msec)
   bw (  KiB/s): min=333224, max=927240, per=100.00%, avg=568914.64, stdev=173766.69, samples=414
   iops        : min=83306, max=231810, avg=142228.69, stdev=43441.70, samples=414
  write: IOPS=47.4k, BW=185MiB/s (194MB/s)(37.5GiB/207369msec); 0 zone resets
   bw (  KiB/s): min=110912, max=306112, per=100.00%, avg=189608.24, stdev=57858.32, samples=414
   iops        : min=27728, max=76528, avg=47402.06, stdev=14464.58, samples=414
  cpu          : usr=15.99%, sys=43.29%, ctx=914957, majf=0, minf=6
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%
     issued rwts: total=29492326,9829274,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=64

Run status group 0 (all jobs):
   READ: bw=556MiB/s (583MB/s), 556MiB/s-556MiB/s (583MB/s-583MB/s), io=113GiB (121GB), run=207369-207369msec
  WRITE: bw=185MiB/s (194MB/s), 185MiB/s-185MiB/s (194MB/s-194MB/s), io=37.5GiB (40.3GB), run=207369-207369msec

Disk stats (read/write):
  sdg: ios=29453080/9829388, merge=0/275, ticks=7292548/1934115, in_queue=9226688, util=99.93%

@d347h-eth
Copy link

d347h-eth commented Sep 10, 2023

How did you manage to get such IOPS for Seagate Firecuda 530? I am testing a 4TB drive and the IOPS I am getting are 142k/47k:

@valo I have the same Firecuda and getting 254k/84.7k, but I have it on PCIe 3.0 x4 slot, so it's expected (~2x less throughput than PCIe 4.0 x4).
for your case I'd double-check what's your slot's throughput, because it looks like it's ~2x slower than PCIe 3.0 x4.

@valo
Copy link

valo commented Sep 10, 2023

@d347h-eth I am using Windows 11 with WSL2 and I attach the NVMe directly to WSL2 using wsl2 --mount --bare. Turned out that having Memory integrity enabled in Device security -> Core isolation causes the IOPS to drop in half. After disabling that I get similar results to yours. Interesting find for anyone using a windows + wsl2 system:

test: (g=0): rw=randrw, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=64
fio-3.28
Starting 1 process
test: Laying out IO file (1 file / 153600MiB)
Jobs: 1 (f=1): [m(1)][100.0%][r=843MiB/s,w=281MiB/s][r=216k,w=71.9k IOPS][eta 00m:00s]
test: (groupid=0, jobs=1): err= 0: pid=909: Sun Sep 10 23:05:35 2023
  read: IOPS=218k, BW=853MiB/s (895MB/s)(113GiB/134980msec)
   bw (  KiB/s): min=80937, max=1107312, per=100.00%, avg=875172.81, stdev=131967.58, samples=269
   iops        : min=20234, max=276828, avg=218793.17, stdev=32991.93, samples=269
  write: IOPS=72.8k, BW=284MiB/s (298MB/s)(37.5GiB/134980msec); 0 zone resets
   bw (  KiB/s): min=26981, max=370216, per=100.00%, avg=291685.58, stdev=43874.05, samples=269
   iops        : min= 6745, max=92554, avg=72921.35, stdev=10968.53, samples=269
  cpu          : usr=17.81%, sys=47.06%, ctx=1693386, majf=0, minf=7
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%
     issued rwts: total=29492326,9829274,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=64

Run status group 0 (all jobs):
   READ: bw=853MiB/s (895MB/s), 853MiB/s-853MiB/s (895MB/s-895MB/s), io=113GiB (121GB), run=134980-134980msec
  WRITE: bw=284MiB/s (298MB/s), 284MiB/s-284MiB/s (298MB/s-298MB/s), io=37.5GiB (40.3GB), run=134980-134980msec

Disk stats (read/write):
  sdf: ios=29465514/9820322, merge=0/26, ticks=6502679/1003158, in_queue=7505932, util=99.66%

Seems like the drive is working in PCIe 4.0 x4 mode. I'll make an additional test from a linux live system and see if there is any difference.

@IchigoGirl
Copy link

I am using a Sakura Internet VPS server (Japan) and sometimes Validator crashes.
I measured the IOPS and got the following results.
CPU 8 Core/ Memory 16GB / SSD 1600GB VPS Service.
I may need to change my cloud service.(;;)

<journalctl WARN/error log>
Aug 04 20:14:58 ik1-430-47259 lighthouse[93709]: Aug 04 11:14:58.747 WARN Execution engine call failed error: HttpClient(url: http://localhost:8551/, kind: timeout, detail: operation timed out), service: exec
Aug 04 20:14:58 ik1-430-47259 lighthouse[93709]: Aug 04 11:14:58.747 WARN Error whilst processing payload status error: Api { error: HttpClient(url: http://localhost:8551/, kind: timeout, detail: operation timed out) }, service: exec
Aug 04 20:14:58 ik1-430-47259 lighthouse[93709]: Aug 04 11:14:58.747 CRIT Failed to update execution head error: ExecutionForkChoiceUpdateFailed(EngineError(Api { error: HttpClient(url: http://localhost:8551/, kind: timeout, detail: operation timed out) })), service: beacon

test: (groupid=0, jobs=1): err= 0: pid=663286: Mon Sep 18 18:12:07 2023 read: IOPS=4391, BW=17.2MiB/s (18.0MB/s)(113GiB/6715029msec) bw ( KiB/s): min= 2260, max=23072, per=100.00%, avg=17634.97, stdev=1648.47, samples=13385 iops : min= 565, max= 5768, avg=4408.63, stdev=412.13, samples=13385 write: IOPS=1463, BW=5855KiB/s (5996kB/s)(37.5GiB/6715029msec); 0 zone resets bw ( KiB/s): min= 88, max= 7552, per=100.00%, avg=5876.91, stdev=487.16, samples=13386 iops : min= 22, max= 1888, avg=1469.15, stdev=121.81, samples=13386 cpu : usr=0.82%, sys=6.41%, ctx=4757653, majf=0, minf=6 IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0% issued rwts: total=29492326,9829274,0,0 short=0,0,0,0 dropped=0,0,0,0 latency : target=0, window=0, percentile=100.00%, depth=64

Run status group 0 (all jobs):
READ: bw=17.2MiB/s (18.0MB/s), 17.2MiB/s-17.2MiB/s (18.0MB/s-18.0MB/s), io=113GiB (121GB), run=6715029-6715029msec
WRITE: bw=5855KiB/s (5996kB/s), 5855KiB/s-5855KiB/s (5996kB/s-5996kB/s), io=37.5GiB (40.3GB), run=6715029-6715029msec

Disk stats (read/write):
vda: ios=30713239/9971460, merge=7896/111624, ticks=17920914/413844545, in_queue=431767366, util=77.61%

@ichibrosan
Copy link

ichibrosan commented Sep 24, 2023

As a newbie in this field, I can share an observation. Investing in storage hardware manufacturer's stocks might be as advantageous as investing in cryptocurrency. Building the properly optimized rig to handle this data is quite a task, intellectually and monetarily. I am very impressed with the work you people are doing :-) I do have a question. I read that a "full" archive node with all state back to genesys requires more than 12TB. The most capable motherboard I have on hand has four M.2 slots, 1 Gen5 and 3 Gen4. The largest NVMe SSDs I can buy right now are 4TB and some are Gen5 and expensive. If I pop 3 and the Gen4's into the Gen4 slots that would give me 12TB for the full archive, but its not the fastest. This motherboard also has a ton of SATAs. If its not to much to ask, could you answer the question, whether it would be better from a cost/performance perspective to max out the NVMe4s for the archive, use the 5 for the os, or put the archive on the SATAs? Thanks

@yorickdowne
Copy link
Author

It’d be best to run a smaller archive node. Both Reth and Erigon can fit an archive into a single 4TB disk, taking just over 2 TiB. Geth is working on similar capability, early 2024 maybe.

@valo
Copy link

valo commented Sep 28, 2023

Here is a benchmark of Seagate Firecuda 530 4TB on a native Ubuntu 22.04 install. Same hardware as my WSL2 test from above. As you can see the IOPS are about 50% higher, so if you are using WSL2, migrating to native linux should give you quite a bit of IO speedup. Interestingly I can't replicate the IOPS from the gist for this device.

test: (g=0): rw=randrw, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=64
fio-3.28
Starting 1 process
Jobs: 1 (f=1): [m(1)][100.0%][r=1294MiB/s,w=431MiB/s][r=331k,w=110k IOPS][eta 00m:00s]
test: (groupid=0, jobs=1): err= 0: pid=153177: Thu Sep 28 15:15:18 2023
  read: IOPS=331k, BW=1291MiB/s (1354MB/s)(113GiB/89206msec)
   bw (  MiB/s): min= 1053, max= 1327, per=100.00%, avg=1291.95, stdev=35.50, samples=178
   iops        : min=269642, max=339804, avg=330739.91, stdev=9088.15, samples=178
  write: IOPS=110k, BW=430MiB/s (451MB/s)(37.5GiB/89206msec); 0 zone resets
   bw (  KiB/s): min=362144, max=454496, per=100.00%, avg=440922.97, stdev=11996.22, samples=178
   iops        : min=90536, max=113624, avg=110230.74, stdev=2999.06, samples=178
  cpu          : usr=14.33%, sys=71.05%, ctx=4381204, majf=0, minf=8
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%
     issued rwts: total=29492326,9829274,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=64

Run status group 0 (all jobs):
   READ: bw=1291MiB/s (1354MB/s), 1291MiB/s-1291MiB/s (1354MB/s-1354MB/s), io=113GiB (121GB), run=89206-89206msec
  WRITE: bw=430MiB/s (451MB/s), 430MiB/s-430MiB/s (451MB/s-451MB/s), io=37.5GiB (40.3GB), run=89206-89206msec

Disk stats (read/write):
  nvme1n1: ios=29473358/9822980, merge=0/17, ticks=4254089/128160, in_queue=4382314, util=99.92%

@valamidev
Copy link

As of October 2023:

The Contabo VPS SSD (non-NVMe) is fully capable of running an Ethereum 2.0 mainnet Execution + Validator Node.

Geth version >= 1.13.2 or later with PBSS (path-based database storage) and the Lighthouse validator client.

Geth sync was completed in 12 hours and 30 minutes.

@yorickdowne
Copy link
Author

Good to know. I assume Nethermind still cannot sync, or can you report that it now can?

@valamidev
Copy link

Good to know. I assume Nethermind still cannot sync, or can you report that it now can?

ETH network load is quite low nowadays, but it can Nethermind can sync and keep it up with the chain, but I can confirm Nethermind is much more I/O hungry and touch the IOPS limit.
You can ask higher IOPS at Contabo by the support, usually you got it.

Nethermind logs:

 Processed            18326160     |    819.55 ms  |  slot     11,814 ms | Gas gwei: 7.36 .. 7.36 (9.48) .. 60.93
 Processed            18326161     |  1,154.41 ms  |  slot     14,673 ms | Gas gwei: 7.27 .. 7.27 (11.52) .. 230.44
 Processed            18326162     |    667.72 ms  |  slot      9,832 ms | Gas gwei: 7.64 .. 7.65 (11.12) .. 95.42
 Processed            18326163     |    677.76 ms  |  slot     14,253 ms | Gas gwei: 7.50 .. 7.61 (10.95) .. 257.55
 Processed            18326164     |    642.48 ms  |  slot     11,875 ms | Gas gwei: 7.90 .. 7.98 (11.24) .. 115.91

@kaloyan-raev
Copy link

Kingston KC3000 2TB on Ubuntu 22.04:

test: (g=0): rw=randrw, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=64
fio-3.28
Starting 1 process
test: Laying out IO file (1 file / 153600MiB)
Jobs: 1 (f=1): [m(1)][100.0%][r=1482MiB/s,w=493MiB/s][r=379k,w=126k IOPS][eta 00m:00s]
test: (groupid=0, jobs=1): err= 0: pid=1513: Fri Dec  1 15:27:59 2023
  read: IOPS=377k, BW=1473MiB/s (1545MB/s)(113GiB/78201msec)
   bw (  MiB/s): min= 1134, max= 1506, per=100.00%, avg=1474.69, stdev=42.25, samples=156
   iops        : min=290478, max=385538, avg=377520.78, stdev=10814.73, samples=156
  write: IOPS=126k, BW=491MiB/s (515MB/s)(37.5GiB/78201msec); 0 zone resets
   bw (  KiB/s): min=386840, max=514416, per=100.00%, avg=503278.41, stdev=14299.46, samples=156
   iops        : min=96710, max=128604, avg=125819.59, stdev=3574.86, samples=156
  cpu          : usr=14.90%, sys=71.19%, ctx=3805582, majf=0, minf=6
  IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=100.0%
     submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
     complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.1%, >=64=0.0%
     issued rwts: total=29492326,9829274,0,0 short=0,0,0,0 dropped=0,0,0,0
     latency   : target=0, window=0, percentile=100.00%, depth=64

Run status group 0 (all jobs):
   READ: bw=1473MiB/s (1545MB/s), 1473MiB/s-1473MiB/s (1545MB/s-1545MB/s), io=113GiB (121GB), run=78201-78201msec
  WRITE: bw=491MiB/s (515MB/s), 491MiB/s-491MiB/s (515MB/s-515MB/s), io=37.5GiB (40.3GB), run=78201-78201msec

Disk stats (read/write):
    dm-0: ios=29487639/9827779, merge=0/0, ticks=2155548/89524, in_queue=2245072, util=99.97%, aggrios=29492812/9829478, aggrmerge=29/85, aggrticks=2198992/106382, aggrin_queue=2305387, aggrutil=99.90%
  nvme0n1: ios=29492812/9829478, merge=29/85, ticks=2198992/106382, in_queue=2305387, util=99.90%

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment