Aș dori să pun o întrebare, apoi să o urmez cu propriul meu răspuns, dar și să văd ce răspunsuri au alte persoane.
Avem două fișiere mari pe care le-am dori să le citim de la două fire separate în același timp. Un fir va citi secvențial fișierul A, în timp ce celălalt fir va citi secvențial fișierul B. Nu există nici o blocare sau comunicare între fire, ambele se citesc secvențial cât de repede pot și ambele elimină imediat datele pe care le citesc.
Experiența noastră cu această configurare pe Windows este foarte slabă. Procesul combinat al celor două fire este de ordinul a 2-3 MiB/sec. Unitatea pare să fie petrecându-și majoritatea timpului căutând înapoi și înainte între cele două fișiere, probabil lectură foarte puțin după fiecare caută.
Dacă dezactivam una din fire și analizăm temporar performanța unui singur fir, atunci obținem o lățime de bandă mult mai bună (~ 45 MiB/sec pentru această mașină). Deci, în mod clar, performanța negativă cu două fire este un artefact al planificatorului de discuri OS.
Is there anything we can do to improve the concurrent thread read performance? Perhaps by using different APIs or by tweaking the OS disk scheduler parameters in some way.
Unele detalii:
Fișierele sunt de ordinul a 2 GiB fiecare pe o mașină cu 2GiB de RAM. În scopul acestei întrebări, considerăm că nu sunt cache și defragmentează perfect. Am folosit instrumente de defragmentare și am rebootat pentru a ne asigura că este cazul.
Nu folosim API-uri speciale pentru a citi aceste fișiere. Comportamentul este repetabil pe diferite API bogate standard, cum ar fi CreateFile Win32, C fopen, C ++'s std :: ifstream, FileInputStream Java etc.
Fiecare fir se rotește într-o buclă care face apeluri la funcția de citire. Am variat numărul de octeți solicitați de API fiecare iterație de la valori între 1KiB și 128MiB. Variajul acestui lucru nu a avut niciun efect, atât de clar că suma pe care sistemul de operare le citește fizic după ce fiecare disc este căutat nu este dictat de acest număr. Acesta este exact ceea ce trebuie așteptat.
Diferența dramatică între performanțele cu un fir și cele cu două fire este repetabilă între Windows 2000, Windows XP (32-bit și 64-bit), Windows Server 2003, dar și cu și fără hardware RAID5.