So for my work I'm developing a product that uses a Raspberry Pi Compute module and we were facing a few issues with the storage on board:

1) We need more than 4GB of storage which meant we had to rule out using the CM3 (4GB) and for our target was only the 8GB CM3+. However just a few weeks ago the major suppliers had no stock with lead times being November (however now they have got 10,000 units in stock).
But at the time and still do there's over 24,000 CM3+/Lites in stock, plus the CM3+/Lite is almost identical to the Non Plus variant apart from the heatspreader. This means we can also use the stock of over 23,000 of them meaning that stock limitations are very unlikely.

2) Bulk programming, programming the Compute Modules is a longwinded task. You have to have a board for each compute module which thanks to our daughterboard approach we can have. But then require to put each compute module in, power them up. Wait for them to boot into the flash mode and then write the data. While we can then use balena etcher to speed up writing by writing to multiple modules at the same time, it's not ideal.
With SD Cards we can put them in our duplicator and write tens of SD cards at once much quicker. It also makes it easier for customers to re-flash too altough the process we've used with our daughterboard already makes this easier.

Testing on the Pi:

Raspberry Pi Benchmark

To begin I setup to use the RPi tool that can benchmark SD cards, downloading the two raw scripts to run it from SSH (https://raw.githubusercontent.com/raspberrypi-ui/agnostics/master/data/sdtest.sh & https://raw.githubusercontent.com/raspberrypi-ui/agnostics/master/data/sd_bench.fio)

I then modified the sdtest.sh to link to where I downloaded the fio file. Then apt installed FIO and ran the test.

This worked, however I had to re-run the test to loop it 3 times rather than it stay automated.

Compute Module 3+ 8GB:

prepare-file;0;0;20693;40
seq-write;0;0;20917;40
rand-4k-write;0;0;12845;3211
rand-4k-read;15131;3782;0;0
Sequential write speed 20917 KB/sec (target 10000) - PASS
Random write speed 3211 IOPS (target 500) - PASS
Random read speed 3782 IOPS (target 1500) - PASS
prepare-file;0;0;20706;40
seq-write;0;0;20634;40
rand-4k-write;0;0;11883;2970
rand-4k-read;15128;3782;0;0
Sequential write speed 20634 KB/sec (target 10000) - PASS
Random write speed 2970 IOPS (target 500) - PASS
Random read speed 3782 IOPS (target 1500) - PASS
prepare-file;0;0;22382;43
seq-write;0;0;22088;43
rand-4k-write;0;0;11972;2993
rand-4k-read;15069;3767;0;0
Sequential write speed 22088 KB/sec (target 10000) - PASS
Random write speed 2993 IOPS (target 500) - PASS
Random read speed 3767 IOPS (target 1500) - PASS

16GB Sandisk Class 10 Card:

As my generic SD card I went with testing against a 16GB Sandisk Class 10 Card

Run 1
prepare-file;0;0;13579;26
seq-write;0;0;11360;22
rand-4k-write;0;0;3403;850
rand-4k-read;7363;1840;0;0
Sequential write speed 11360 KB/sec (target 10000) - PASS
Random write speed 850 IOPS (target 500) - PASS
Random read speed 1840 IOPS (target 1500) - PASS
prepare-file;0;0;20758;40
seq-write;0;0;15945;31
rand-4k-write;0;0;4471;1117
rand-4k-read;7371;1842;0;0
Sequential write speed 15945 KB/sec (target 10000) - PASS
Random write speed 1117 IOPS (target 500) - PASS
Random read speed 1842 IOPS (target 1500) - PASS
prepare-file;0;0;20745;40
seq-write;0;0;12822;25
rand-4k-write;0;0;4602;1150
rand-4k-read;7365;1841;0;0
Sequential write speed 12822 KB/sec (target 10000) - PASS
Random write speed 1150 IOPS (target 500) - PASS
Random read speed 1841 IOPS (target 1500) - PASS

8GB Sandisk Industrial Class 10 Card:

prepare-file;0;0;18265;35
seq-write;0;0;18378;35
rand-4k-write;0;0;2124;531
rand-4k-read;6262;1565;0;0
Sequential write speed 18378 KB/sec (target 10000) - PASS
Random write speed 531 IOPS (target 500) - PASS
Random read speed 1565 IOPS (target 1500) - PASS
prepare-file;0;0;18138;35
seq-write;0;0;18265;35
rand-4k-write;0;0;2092;523
rand-4k-read;6262;1565;0;0
Sequential write speed 18265 KB/sec (target 10000) - PASS
Random write speed 523 IOPS (target 500) - PASS
Random read speed 1565 IOPS (target 1500) - PASS
prepare-file;0;0;18239;35
seq-write;0;0;18244;35
rand-4k-write;0;0;2081;520
rand-4k-read;6240;1560;0;0
Sequential write speed 18244 KB/sec (target 10000) - PASS
Random write speed 520 IOPS (target 500) - PASS
Random read speed 1560 IOPS (target 1500) - PASS


Interestingly the sequential writes on the industrial SD Card are better than the normal, however both are slower than the soldered on EMMC.

The random write speed doesn't really matter for our usecase. And the reads aren't performing much worse than the non industrial SD Card.

Further Benchmarking

To further benchmark I found that the website Raspberry Pi Dramble had a script which ran most of the other tests I wanted automatically so decided to use that and just tookthe HD param and DD results.

Compute Module 3+ 8GB:

Running hdparm test...

/dev/mmcblk0:
 HDIO_DRIVE_CMD(identify) failed: Invalid argument
 Timing buffered disk reads:  70 MB in  3.06 seconds =  22.89 MB/sec

Running dd test...

51200+0 records in
51200+0 records out
419430400 bytes (419 MB, 400 MiB) copied, 18.4435 s, 22.7 MB/s

16GB Sandisk Class 10 Card:

Running hdparm test...

/dev/mmcblk0:
 HDIO_DRIVE_CMD(identify) failed: Invalid argument
 Timing buffered disk reads:  68 MB in  3.00 seconds =  22.66 MB/sec

Running dd test...

51200+0 records in
51200+0 records out
419430400 bytes (419 MB, 400 MiB) copied, 32.3071 s, 13.0 MB/s

8GB Sandisk Industrial Class 10 Card:


/dev/mmcblk0:
 HDIO_DRIVE_CMD(identify) failed: Invalid argument
 Timing buffered disk reads:  68 MB in  3.01 seconds =  22.60 MB/sec

Running dd test...

51200+0 records in
51200+0 records out
419430400 bytes (419 MB, 400 MiB) copied, 22.3682 s, 18.8 MB/s

The buffered disk reads are all within run to run tolerance between both SD Cards and the EMMC which would indicate that these are being bottlenecked by the Pi itself. The reason we also don't see much difference between the CM3 with SD Cards and CM3+ is that the CM3+ is clocked to the same levels as the CM3 and not the same as  3B+.

The DD Write test confirms the sequential write is quicker on the industrial card and isn't much further behind the EMMC.

Conclusion

Overall I'm pretty happy with the industrial Sandisk card, you may ask why industrial?

As mentioned this is for a compute module project with one of the main selling points of the EMMC on a compute module being that it should last longer, and I agree it should last longer than your average SD Card.

But one thing I didn't like is I can't find any mention on the datasheets of the compute module, asking on the RPi Forums, asking Farnell, nor on the datasheet for the EMMC chip itself about it's TBW Value.

TBW means how many terabytes of data can be written over the life of the drive so the higher the number is usually the better and is with SD cards something not normally stated but is with EMMC.  

When jumping to industrial SD Cards as the type of NAND Flash used is MLC rather than TLC traditionally used in cheaper SD Cards these increase reliability and MLC is also typically used for EMMCs (which I believe the EMMC On the RPi is).

And with a rating of 3,000 Terabytes of data this should be more than good enough for our usecase which may have only 100MB written in a day with a peak of 500MB on a day with updates.