Je suis en train de courir Ubuntu 16.04
con RocketRaid 2720SGL HBA board
que j'ai mis à jour le firmware pour enlever le RAID handler et juste utiliser les ports.
Il y a deux ports sur la carte qui permettent une sortie de quatre disques par port ou un total de huit disques. J'ai deux disques par port connecté.
Lorsque le système démarre, la carte voit les quatre disques comme 0, 1 pour le premier port et 4, 5 pour le second. Cela ne pose aucun problème.
Lorsque je liste les lecteurs, je les vois comme sdb, sdc, sdd, et sde. Dans /dev/disk/by-path Je les vois comme 0, 1, 4, 5. Je l'utilise pour savoir quel port de lecteur réel est lié à quel identifiant de périphérique.
Avec quatre bons disques de 500 Go, je peux effacer les quatre disques en 70 à 80 minutes environ, soit le temps qu'il faudrait pour effacer un seul disque. J'utilise
if((RetVal = pthread_create(&DIptr->DI_ThreadFD, NULL, WipeTheDrive, DIptr)) != 0)
{
printf("WIPESINGLEDRIVE: ERROR: return code from pthread_create() is %d errno: [%d]\n", RetVal, errno);
}
pour exécuter les quatre fils indépendamment. Si les disques n'ont pas de secteurs défectueux ou d'anomalies, l'effacement se passe bien. J'ouvre les disques en utilisant O_RDWR|O_DIRECT et j'ai placé mes buffers sur la bonne frontière pour pouvoir utiliser le DMA en utilisant WipeBuffer [1048576] __attribut__ ((__aligned__ (1048576))) ;
Tout cela fonctionne bien, j'ai fait passer 240 disques par cette logique à raison de quatre disques à la fois et je n'ai jamais eu de problème.
C'est pourtant la situation. Si l'un des quatre lecteurs a des secteurs défectueux ou a une écriture lente, ou une lecture lente, cela affecte le timing de tous les autres lecteurs. En d'autres termes, si le lecteur 1 a des secteurs défectueux et attend le retour de la lecture ou de l'écriture, les autres lecteurs attendent également. C'est comme s'ils partageaient une sorte de file d'attente ou de tampon et qu'ils étaient tous en ligne à attendre leur tour. J'ai des routines qui classent les disques en fonction des performances de lecture et d'écriture et j'obtiens un faux échec si un disque a des problèmes.
Tout ceci étant dit, tout d'abord, je ne sais pas ce qui cause ce problème, est-ce le système d'exploitation qui met les tâches en attente dans le noyau, est-ce le pilote, bien que je ne pense pas que ce soit le cas ? J'ai envoyé un email au support technique de Marvell qui sont les développeurs du firmware et ils m'ont dit que chaque canal sur la carte est indépendant avec un canal DMA pour quatre disques. J'ai réparti les disques entre les deux canaux DMA et j'obtiens toujours un ralentissement sur tous les disques si l'un d'eux est lent.
Que dois-je changer pour obtenir quatre canaux indépendants sans que l'un n'affecte l'autre ?
\=========================================================================
Après la suggestion d'utiliser blktrace, je l'ai installé et exécuté avec quatre disques écrivant en même temps. La trace était bonne et semblait partager les écritures assez bien.
J'ai ensuite retiré l'un des lecteurs et la trace ressemblait à ceci
8,48 2 422 0.542202510 12017 Q WS 581826560 + 2048 [client]
8,48 2 423 0.542207566 12017 Q WS 581827584 + 1024 [client]
8,48 2 424 0.542208902 12017 G WS 581826560 + 1024 [client]
8,48 2 425 0.542213507 12017 G WS 581827584 + 1024 [client]
8,48 2 426 0.542214337 12017 I WS 581826560 + 1024 [client]
8,48 2 427 0.542214854 12017 I WS 581827584 + 1024 [client]
8,48 2 428 0.542221516 289 D WS 581826560 + 1024 [kworker/2:1H]
8,48 2 429 0.542228504 289 R WS 581826560 + 1024 [0]
8,48 2 430 0.542228808 289 I WS 581826560 + 1024 [kworker/2:1H]
8,48 2 431 0.542572302 289 D WS 581826560 + 1024 [kworker/2:1H]
8,48 2 432 0.542572979 289 R WS 581826560 + 1024 [0]
8,48 2 433 0.542573279 289 I WS 581826560 + 1024 [kworker/2:1H]
8,48 2 434 0.546583088 289 D WS 581826560 + 1024 [kworker/2:1H]
8,48 2 435 0.546583892 289 R WS 581826560 + 1024 [0]
8,48 2 436 0.546584227 289 I WS 581826560 + 1024 [kworker/2:1H]
8,48 2 437 0.550587702 289 D WS 581826560 + 1024 [kworker/2:1H]
8,48 2 438 0.550588397 289 R WS 581826560 + 1024 [0]
8,48 2 439 0.550588711 289 I WS 581826560 + 1024 [kworker/2:1H]
8,48 2 440 0.554580452 289 D WS 581826560 + 1024 [kworker/2:1H]
8,48 2 441 0.554581354 289 R WS 581826560 + 1024 [0]
8,48 2 442 0.554581664 289 I WS 581826560 + 1024 [kworker/2:1H]
Vous pouvez voir où 'client', qui est le nom de l'exécutable, met en file d'attente les écritures, et ensuite le processus 'kworker' reste et martèle le disque que j'ai retiré. Ce n'est qu'un petit échantillon, mais il tourne pendant des pages et des pages et le client n'a jamais la possibilité d'émettre de nouvelles écritures pour les trois autres disques. Si je comprends bien, un processus 'kworker' est un processus du noyau qui travaille avec les E/S des périphériques.
Ma question est donc la suivante : comment puis-je faire en sorte que le processus 'kworker' ne monopolise pas l'ensemble du processus d'E/S et partage les canaux avec le reste des périphériques lorsqu'un lecteur se déconnecte ou a une écriture ou une lecture lente.