Saya akan mulai dari jauh. Musim dingin yang lalu saya kebetulan membuat perangkat USB dengan inti yang di-host di FPGA. Tentu saja, saya benar-benar ingin memeriksa bandwidth sebenarnya dari bus ini. Lagi pula, di controller - ada terlalu banyak yang harus dilakukan. Anda selalu dapat mengatakan bahwa ada penundaan, atau di sana. Dalam kasus FPGA, saya melihat blok memompa data, jadi dia mengatakan kepada saya bahwa ada data di dalamnya. Tapi saya mengatur bahwa semuanya sudah diproses, dan saya siap menerima bagian baru (pada saat yang sama, sudah menerima data dalam buffer kedua dari titik akhir yang sama). Hebat, atur kesiapan dari ukuran pertama dan lihat apa yang terjadi ketika USB bisa "dipalu" tanpa berhenti.

Tapi ternyata hal yang luar biasa. Jika perangkat USB 2.0 macet di konektor "biru" (yaitu USB 3.0), maka kecepatannya adalah satu. Jika dalam "hitam" - yang lain. Berikut ini adalah grafik kecepatan perekaman USB versus panjang data. USB3 dan USB2 adalah jenis konektor, perangkat selalu USB 2.0 HS.

Saya mencoba di mesin yang berbeda. Hasilnya dekat. Tidak ada yang bisa menjelaskan fenomena ini kepada saya. Kemudian, saya menemukan alasan yang paling memungkinkan. Dan alasannya sangat sederhana. Berikut adalah properti pengontrol USB 2.0:

Pengontrol yang mengontrol konektor "biru" tidak. Dan perbedaannya hanya sekitar 20 persen.
Dari sini kami menyimpulkan bahwa batasan bandwidth tidak selalu ditentukan oleh sifat fisik bus. Terkadang beberapa hal lain ditumpangkan. Kami lulus dengan pengetahuan ini hari ini.
Eksperimen primer
Jadi Semuanya dimulai dengan biasa saja. Ada cek satu program. Proses penulisan data ke beberapa disk secara bersamaan diperiksa. Perangkat kerasnya sederhana: ada motherboard dengan empat slot PCIe. Kartu yang benar-benar identik dengan pengontrol AHCI dimasukkan ke semua slot, yang masing-masing mendukung PCIe x1 secara eksklusif.

Setiap kartu melayani 4 drive.
Dan kemudian efek berikut terungkap. Kami mengambil satu disk dan mulai menulis data ke dalamnya. Kami mendapatkan kecepatan 180 hingga 220 megabita per detik (selanjutnya, megabita adalah 1024 * 1024 byte):

Kami mengambil drive kedua. Kecepatan tulisnya dari 170 hingga 190 MB / s:

Kami segera menulis untuk keduanya - kami mendapatkan drawdown of speed:

Kecepatan totalnya sekitar 290 MB / s. Tetapi hal yang menakjubkan adalah bahwa kita men-debug (ternyata) program ini pada drive yang sama, tetapi pada saluran lain. Dan semuanya baik-baik saja di sana. Kami dengan cepat mentransfer ke saluran tersebut (mereka akan melalui kartu lain), kami mendapatkan pekerjaan yang sangat baik:

Saya akan membeli slot di area yang bagus
Saya harus segera mengatakan bahwa tidak layak menyalahkan semuanya pada komponen orang lain. Semuanya di sini ditulis oleh kami, mulai dari program itu sendiri, berakhir dengan driver. Jadi seluruh jalur data dapat dipantau. Unknown hanya muncul saat permintaan masuk ke perangkat keras.
Setelah analisis awal, ternyata kecepatannya tidak terbatas pada slot PCIe "panjang" dan terbatas pada slot "pendek". Yang lama adalah tempat Anda dapat memasukkan kartu x16 (meskipun salah satunya berfungsi dalam mode tidak lebih tinggi dari x4), dan yang pendek hanya untuk kartu x1.

Semuanya akan baik-baik saja, tetapi pengendali di kartu saat ini, pada prinsipnya, tidak dapat bekerja dalam mode selain PCIex1. Artinya, semua pengontrol harus dalam kondisi yang benar-benar identik, terlepas dari panjang slot! Tapi tidak. Siapa yang hidup dalam "lama" - bekerja cepat, yang dalam "pendek" - perlahan. Bagus Dan cepat - seberapa cepat? Tambahkan drive ketiga, tulis ke ketiganya.
Di slot "pendek", batasnya masih sekitar 290 MB / s:

Dalam "panjang" - di wilayah 400 MB / s:


Saya mencari di seluruh Internet. Pertama, setelah beberapa waktu saya sudah tertawa dari artikel yang mengatakan bahwa throughput PCIe gen 1 dan gen 2 untuk x1 adalah 250 dan 500 MB / s. Ini adalah megabita mentah. Karena overhead (saya menggunakan kata non-Rusia ini untuk menunjukkan pertukaran layanan yang sejalan dengan data utama) untuk gen 2 kami mendapatkan tepat 400 megabita per detik aliran yang berguna. Kedua, saya dengan keras kepala tidak dapat menemukan apa pun tentang angka ajaib 290 (melihat ke depan - saya masih belum menemukannya).
Bagus Mencoba melihat topologi pencantuman pengontrol kami. Ini dia (013-015 - ini adalah sufiks nama perangkat yang dengannya saya mencocokkannya untuk membedakannya). Hijau cepat, merah lambat.

Kontroler "015" bahkan tidak kita pertimbangkan. Dia tinggal di slot istimewa yang dirancang untuk kartu video. Tetapi 013 terhubung ke saklar yang sama dengan 012 dari 014. Bagaimana dia berbeda?
Beberapa artikel mengatakan bahwa kartu yang berbeda mungkin berbeda dalam pengaturan Muatan Maks. Saya mempelajari ruang konfigurasi semua kartu - parameter ini untuk semua orang dengan nilai minimum yang sama. Selain itu, dokumentasi untuk chipset dari motherboard ini mengatakan bahwa tidak ada arti lain.

Secara umum, saya mencari-cari segala sesuatu di ruang konfigurasi - semuanya dikonfigurasi secara identik. Dan kecepatannya berbeda! Baca ulang dokumentasi untuk chipset berulang kali - tanpa pengaturan bandwidth. Prioritas - ya, sesuatu telah ditulis tentangnya, tetapi pengujian dilakukan dengan tidak adanya beban pada saluran lain! Artinya, itu tidak ada di dalamnya.
Untuk jaga-jaga, saya bahkan mematikan program interupsi. Beban prosesor telah meningkat menjadi jumlah yang gila, karena sekarang secara bodoh membaca bit kesiapan, tetapi pembacaan kecepatan tidak berubah. Jadi tidak mungkin untuk menyalahkan subsistem ini untuk masalah.
Dan bagaimana dengan papan lainnya?
Kami mencoba mengubah motherboard menjadi persis sama. Tidak ada perubahan Mereka mencoba mengganti prosesor (ada alasan untuk percaya bahwa itu adalah sampah). Juga, tidak ada perubahan dalam kecepatan (tetapi prosesor lama benar-benar sampah). Kami memasang motherboard generasi baru - semuanya hanya terbang di semua slot. Selain itu, kecepatan maksimum tidak lagi 400, tetapi 418 megabita per detik, bahkan di slot "panjang", bahkan di slot "pendek":

Tapi di sini - tidak ada keajaiban. Dengan gerakan tangan yang biasa (sudah digunakan sampai hari ini), kami membaca ruang konfigurasi dan melihat bahwa parameter Muatan Muatan diatur tidak ke 128, tetapi ke 256 byte.
Ukuran paket lebih besar - paket lebih sedikit. Lebih sedikit overhead untuk mengirimkannya - lebih banyak data berguna yang dikelola untuk berjalan dalam waktu yang bersamaan. Benar juga.
Jadi siapa yang harus disalahkan?
Saya tidak akan memberikan jawaban yang tepat untuk pertanyaan dari judul, dengan merujuk pada dokumen. Tapi pikiranku berjalan di jalur berikut: katakanlah pembatasan aliran diatur di dalam chipset. Itu tidak dapat diprogram, diatur dengan ketat, tetapi itu benar. Sebagai contoh, itu sama dengan 290 megabyte per detik untuk setiap perbedaan. pasangan. Lebih - itu sudah dipotong di suatu tempat di dalam chipset pada mekanisme internalnya. Oleh karena itu, dalam slot "panjang" (di mana Anda dapat menempelkan kartu hingga x4), tidak ada yang terpotong untuk kartu kami di dalam chipset, dan kami bersandar pada batas fisik bus x1. Pada konektor "pendek", kami mengalami batasan ini.
Sebenarnya, memeriksa ini tidak mudah, tetapi sangat sederhana. Kami tetap di slot 013 bukan AHCI, tetapi pengontrol SAS, yang melayani 8 drive sekaligus dan dapat bekerja dalam mode PCIe hingga x4. Kami menghubungkan 4 drive SSD pintar untuk itu. Kami melihat kecepatan perekaman - sebanyak jiwa bersukacita:

Sekarang kita tambahkan 4 disk yang muncul di tes pertama. Kinerja SSD diprediksi menurun:

Kami menghitung kecepatan total melewati pengontrol SAS, kami mendapatkan 1.175 megabita per detik. Bagi dengan 4 (begitu banyak baris menuju slot "panjang"), kita dapatkan ... Drum roll ... 293 megabyte per detik. Di suatu tempat saya sudah melihat nomor ini!
Jadi, dalam kerangka kerja proyek ini, terbukti bahwa masalahnya bukan pada program atau driver kami, tetapi dalam keterbatasan aneh dari chipset, yang mungkin "kabel" erat. Metodologi untuk memilih motherboard yang dapat digunakan dalam proyek dikembangkan. Namun secara umum, kami menarik kesimpulan sebagai berikut.
Kesimpulan
- Seringkali dalam kehidupan nyata, peralatan memiliki kinerja yang kurang dari yang dimungkinkan secara teoritis. Pembatasan bahkan dapat dikenakan oleh driver, seperti yang ditunjukkan dalam kasus USB. Terkadang dimungkinkan untuk mengambil peralatan yang (atau drivernya) tidak memiliki batasan seperti itu.
- Keterbatasan bahkan mungkin tidak terdokumentasi, tetapi dinyatakan dengan jelas.
- Banyak artikel yang mengatakan bahwa satu pasangan diferensial dari gen PCIe. 1 dan gen 2 menghasilkan sekitar 250 dan 500 megabita per detik, salah. Mereka menyalin kesalahan yang sama dari satu sama lain - satu megabyte data mentah per detik. Overhead terakumulasi di beberapa level antarmuka. Dengan Maks Payload 128 byte, PCIe gen2 sebenarnya mendapatkan sekitar 400 megabita per detik. Dalam generasi PCIe yang lebih baru, semuanya akan menjadi sedikit lebih baik, karena pengkodean fisik tidak ada 8b / 10b, tetapi lebih ekonomis, tetapi sejauh ini tidak ada pengendali drive yang ditemukan untuk memverifikasi ini dalam praktiknya.