Newsgroup: it.comp.os.linux.sys
Titolo: Hard disk con settori da 4 KB (aka: maledetti WD WD10EARS)

Salve,
dopo giorni di indagini per capire quale fosse il motivo dell'estrema 
lentezza dei 3 dischi SATA su un nuovo server Dell PowerEdge R510 (vedi 
post precedenti), ho scoperto che la causa non ï¿œ il controller (SAS 
6/iR), ma sono i dischi (Western Digital WD10EARS)...
Questi dischi, infatti, come pare altri di nuova generazione, utilizzano 
settori da 4 KB, pur "presentandosi" come normali dischi con settori da 
512 B. Secondo quello che ho trovato in giro sul web:
http://www.osnews.com/story/22872/Linux_Not_Fully_Prepared_for_4096-Byte_Sector_Hard_Drives
http://lwn.net/Articles/322777/
http://www.tomshardware.com/reviews/wd-4k-sector,2554-3.html
la lentezza (se ho capito bene) ï¿œ dovuta alle operazioni di 
riallineamento che si rendono necessarie per adattare blocchi da 512 B 
(scritte dal sistema operativo) in blocchi da 4 KB utilizzati dall'hard 
disk. Ad esempio, partizionando un disco normalmente, il settore 
iniziale sarï¿œ il 63 (quindi: 63 * 512B = 32256 B); ma utilizzando i 
settori da 4 K questo punto sarï¿œ al settore 32256/4096 = 7.8; quindi non 
direttamente accessibile dal disco.
La soluzione proposta da Western Digital, per i Windows che non 
gestiscono i settori da 4 KB (XP e non so altri) consiste 
nell'utilizzare un loro tool 
(
http://www.wdc.com/it/products/advancedformat/index.asp
), oppure 
l'apposito jumper presente sull'hard disk..
Mentre per Linux pare che sia sufficiente partizionare i dischi in modo 
che l'inizio delle partizioni coincida con l'inizio di un settore (da 
4KB)... Ecco cosa ho sperimentato personalmente:
tempo formattazione (ext2):
 
	part. non allineata: 1:36
	part. allineata: 0:26
tempo formattazione (ext3):
 
	part. non allineata: 1:39
	part. allineata: 0:28
scrittura file 1 GB (ext2):		
	part. non allineata: 0:11
	part. allineata: 0:10
scrittura file 1 GB (ext3):		
	part. non allineata: 0:33
	part. allineata: 0:13
Di seguito, i dettagli dei test:
--===== partizioni NON allineate =====--
1) Ho creato 2 partizioni, senza badare alla posizione; la situazione ï¿œ 
questa (output di fdisk in cilindri, e poi in settori)
(cilindri)
Device		Boot	Start 	End	 Blocks	           Id   System
/dev/sda1		1	  12925	 103820031    83  Linux
/dev/sda2		12926  25850 103820062+ 83  Linux
(settori)
Device          Boot    Start             End	            Blocks	 
Id    System
/dev/sda1		63	           207640124   103820031     83   Linux
/dev/sda2		207640125   415280249   103820062+  83   Linux
2) ho formattato le partizioni in ext2 (time mkfs.ext2 /dev/sda[12]), 
ecco i tempi:
	sda1 -> 1:40 (real)
	sda2 -> 1:36 (real)
3) ho eseguito un test di scrittura  (dd if=/dev/zero of=/mnt/out 
count=1024 bs=1M; sync); ecco i tempi medi su 3 esecuzioni:
	sda1 -> 11.1 s
	sda2 -> 11.4 s
4) ho formattato le partizioni in ext3 (time mkfs.ext3 /dev/sda[12]), 
ecco i tempi:
	sda1 -> 1:39 (real)
	sda2 -> 1:39 (real)
5) ho eseguito un test di scrittura  (dd if=/dev/zero of=/mnt/out 
count=1024 bs=1M; sync); ecco i tempi medi su 3 esecuzioni:
	sda1 -> 33.2 s
	sda2 -> 33.4 s
--===== partizioni allineate =====--
1) Ho creato 2 partizioni in modo che fossero allineate (partendo dalle 
dimensioni delle partizioni precedenti); la situazione ï¿œ questa (output 
di fdisk in cilindri, e poi in settori)
(cilindri)
Device        Boot   Start    End        Blocks             Id   System
/dev/sda1            1          12925    103820030+ 83   Linux
/dev/sda2            12926  25850    103820061	  83   Linux
(settori)
Device        Boot	Start             End               Blocks 
    Id  System
/dev/sda1               64                 207640124   103820030+  83  Linux
/dev/sda2               207640128   415280249   103820061     83  Linux
2) ho formattato le partizioni in ext2 (time mkfs.ext2 /dev/sda[12]), 
ecco i tempi:
	sda1 -> 26 s (real)
	sda2 -> 27 s (real)
3) ho eseguito un test di scrittura  (dd if=/dev/zero of=/mnt/out 
count=1024 bs=1M; sync); ecco i tempi medi su 3 esecuzioni:
	sda1 -> 10.2 s (real)
	sda2 -> 10.3 s (real)
4) ho formattato le partizioni in ext3 (time mkfs.ext3 /dev/sda[12]), 
ecco i tempi:
	sda1 -> 28.1 s (real)
	sda2 -> 28.2 s (real)
5) ho eseguito un test di scrittura  (dd if=/dev/zero of=/mnt/out 
count=1024 bs=1M; sync); ecco i tempi medi su 3 esecuzioni:
	sda1 -> 13.7 (real)
	sda2 -> 13.6 (real)

 6/iR), ma sono i dischi (Western Digital WD10EARS)...
Avevo letto un articolo sul tema estrememente interessante su DeveloperWorks
http://www.ibm.com/developerworks/linux/library/l-4kb-sector-
disks/index.html?ca=dgr-lnxw074KB-Disksdth-LX
ma non pensavo fosse gi+a *così* facile essere vittima del problema. Grazie 
per condividere la tua esperienza.
-- 
Vide

 /dev/sda2               207640128   415280249   103820061     83  Linux
e' un problema arcinoto nei forum di produttori di NAS tipo synology e
qnap che hanno dovuto affrontare orde di clienti inferociti dalle
prestazioni non all'altezza delle aspettative.
da notare che synology ha deciso di allineare le partizioni a 256 e non
a 64 come fai tu.
il motivo lo ignoro ma, ammesso che esista, sarebbe interessante
scoprirlo.

 scoprirlo.
Azzardo come ipotesi che dato che devono comunque fare la modifica si sono 
"parati il culo" gi� prevedendo eventuali nuovi dischi con "settori" da 16K 
che con molta probabilit� approderanno fra poco tempo sul mercato.
-- 
Flavio Visentin
Ubuntu in Zulu significa "Non so usare Debian". (cit. CtRiX)

 512 B. 
Per vedere la dimensione dei settori basta un normale hdparm -I oppure
ci sono altri sistemi?

 ci sono altri sistemi?
"Some of the existing BIOSs and/or drivers can't cope with drives which
report 4KiB physical sector size. To work around this, some drive
models lie that its physical sector size is 512 bytes when the actual
configuration is 4KiB without offsetting. "
https://ata.wiki.kernel.org/index.php/ATA_4_KiB_sector_issues

 ci sono altri sistemi?
a me esplicitamente non lo visualizza, ecco il mio output:
# hdparm -I /dev/sda
ATA device, with non-removable media
         Model Number:       WDC WD10EARS-00Y5B1
         Serial Number:      WD-WCAV55820962
         Firmware Revision:  80.00A80
         Transport:          Serial, SATA 1.0a, SATA II Extensions, SATA 
Rev 2.5
Standards:
         Supported: 8 7 6 5
         Likely used: 8
Configuration:
         Logical         max     current
         cylinders       16383   16383
         heads           16      16
         sectors/track   63      63
         --
         CHS current addressable sectors:   16514064
         LBA    user addressable sectors:  268435455
         LBA48  user addressable sectors: 1953525168
         device size with M = 1024*1024:      953869 MBytes
         device size with M = 1000*1000:     1000204 MBytes (1000 GB)

 a me esplicitamente non lo visualizza, ecco il mio output:
A me si, bisogna poi vedere se è corretto o meno:
$ sudo hdparm -I /dev/sda
[sudo] password for ale:
/dev/sda:
ATA device, with non-removable media
	Model Number:       WDC WD5000AAKS-75YGA0
	Serial Number:      WD-WCAS84539944
	Firmware Revision:  12.01C02
	Transport:          Serial, SATA 1.0a, SATA II Extensions, SATA Rev 2.5
Standards:
	Supported: 8 7 6 5
	Likely used: 8
Configuration:
	Logical		max	current
	cylinders	16383	16383
	heads		16	16
	sectors/track	63	63
	--
	CHS current addressable sectors:   16514064
	LBA    user addressable sectors:  268435455
	LBA48  user addressable sectors:  976773168
	Logical/Physical Sector size:           512 bytes
	device size with M = 1024*1024:      476940 MBytes
	device size with M = 1000*1000:      500107 MBytes (500 GB)
	cache/buffer size  = 16384 KBytes
-- 
Non tocca a noi dominare tutte le maree del mondo,
il nostro compito è di fare il possibile per la
salvezza degli anni nei quali viviamo,
sradicando il male dai campi che conosciamo.

 4KB)... Ecco cosa ho sperimentato personalmente:
in pratica, usando fdisk con visualizzazione a settori (# fdisk -u 
/dev/<disco>)  bisogna far iniziare tutte le partizioni ad un numero di 
settore divisibile per 8.
Operando su settori (e non cilindri) sarà molto facile incorrere in 
"Partition xx does not end on cylinder boundary", perché la partizione 
creata non si chiude al limite di un cilindro. Per evitarlo, per prima 
cosa bisogna sapere quanti settori ci sono in ogni cilindro, e questo 
possiamo vederlo dall'output di fdisk -l /dev/<disco>:
Disco /dev/sdb: 1000.2 GB, 1000204886016 byte
255 heads, 63 sectors/track, 121601 cylinders
Units = cilindri of 16065 * 512 = 8225280 bytes
ogni cilindro ha 16065 settori, supponendo di voler creare una 
partizione da 50 cilindri (circa 400 MB, infatti 1 cilindro qui ha una 
dimensione di 8 MB circa), il termine del cilindro si troverà a:
16065*50 - 1 = 803249
occhio però a non far iniziare la partizione successiva al cilindro 
803250, questo infatti non è divisibile per 8 e quindi non sarà 
allineato ai settori fisici (da 4 KB) del disco...

 ecco i tempi:
postilla:
- su partizioni piccole, forzare la dimensione dei blocchi a 4K:
	mkfs.ext2 -b 4096 /dev/<partizione>
altrimenti, usando blocchi da 1K le prestazioni di accesso al disco 
saranno comunque compromesse