Over provisioning a Samsung 1TB 850 EVO
Mind you, Don’t follow this tutorial step by step unless you have a 1TB Samsung 850 EVO, if you have a smaller disk, you need to adapt the numbers to your SSD 😉
Over provisioning a flash disk is simply some un-partitioned space a the end of the disk, but you need to tell the SSD’s controller about that free space that it can use to do it’s housekeeping, You also need to find out if the Tejun Heo’s on-demand HPA unlocking patch applies to your distro, if it does, you need to get kernel patching first.
First of all, the controller will usually use the cache RAM to so the over provisioning, or at least this is what i understood from some text on the Samsung website, you can make things faster by allowing it to use FLASH space while it deletes a 1.5MB flash area to put the data in.
1- How big should the over provisioning area be ?
Samsung recommends 10% of the disk’s space. Somewhere hidden in a PDF on their websites, they explain that OP space should be anywhere between 7% and 50% ! we will use 10 as our writing patterns are not that harsh. but mind you, a database that alters a few rows every second can probably make the most use of such OP space.
2- Won’t that 10% wear out before the rest ?
No, there is a mapping function inside the controller where that space is in fact wherever the controller thinks is appropriate, the wear leveling algorithm kicks in at a stage after the logical stage of partitions etc… it is blind to the file system or the over provisioning area, it will simply remap any address you give it to a random address that is not already mapped, at flash erase, those mappings are deleted, and other areas of the disk will be assigned to that area, i have no idea whether it uses a random algorithm, or simply has a record of flash chip usage (At the size of the sample, that won’t make any difference.)
3- Are you sure we are informing the controller and not just telling Linux what the last address is ?
Sure I’m sure, ask the controller DIRECTLY yourself with the command
smartctl -i /dev/sdb
Before the operation we are doing in this article, it will say 1000204886016, and after it will say
User Capacity: 900,184,411,136 bytes [900 GB]
Meaning that now, the disk’s S.M.A.R.T. attribute tells us that this much is available for the user after the over provisioning operation
So, how do we over provision in linux
See the last secrot of your ssd,
hdparm -N /dev/sdb
In my case, my samsung 850 EVO has the following, notice that the number is repeated twice. x out of x is the same, and HPA is disabled..
max sectors = 1953525168/1953525168, HPA is disabled
Now, 1953525168 * 512 = 1,000,204,886,016 (1 TB !)
Now, we want to set a maximum address, anything after this address is a PROTECTED AREA, that the controller knows about, I will multiply the number above with 0.9 to get the maximum address, take the integer part alone
hdparm -Np1758172678 --yes-i-know-what-i-am-doing /dev/sdb (As hdparm -Np1758172678 /dev/sdb will ask you if you know what you are doing)
setting max visible sectors to 1758172678 (permanent)
max sectors = 1758172678/1953525168, HPA is enabled
Now again, hdparm -N /dev/sdb
max sectors = 1758172678/1953525168, HPA is enabled
Now, to make sure we are not suffering that dreaded bug, let’s reboot the system and check again after that, I am using debian Jessie, so it is unlikely that i am affected
Yup, hdparm -N /dev/sdb still gives us a smaller maximum address than the actual physical
Now, we seem to be ready to talk fdisk business.
fdisk /dev/sdb
Now, if you O (Clean), then P, you should get a line such as
Disk /dev/sdb: 838.4 GiB, 900184411136 bytes, 1758172678 sectors
This means that FDISK understands.and asking it to create (the n command) will yeild this
/dev/sdb1 2048 1758172677 1758170630 838.4G 83 Linux
Arent we happy people.
Now, lets mount with trim support, and enjoy all the beutiful abilities an SSD will bless us with.
tune2fs -o journal_data_writeback /dev/sdb1
tune2fs -O ^has_journal /dev/sdb1
NOTE: in the event that you are presented with an error such as the following
/dev/sde:
setting max visible sectors to 850182933 (permanent)
SG_IO: bad/missing sense data, sb[]: 70 00 05 00 00 00 00 0a 04 51 40 01 21 04 00 00 a0 14 00 00 00 00 00 00 00 00 00 00 00 00 00 00
max sectors = 1000215216/1000215216, HPA is disabled
The most likely cause is the SATA controller (Try executing the hdparm -Np command using a different SATA controller), another possible cause of errors is that some disks require being trimmed before this action