Saya tidak berpikir arbitrasi adalah masalahnya di sini, dan menyesuaikan pengaturannya memerlukan dukungan papan serta modifikasi kernel. Antarmuka kemampuan tambahan vc ditangani sebagian di kernel linux di sini:http://lxr.free-electrons.com/source/drivers/pci/vc.c
Saya telah menulis driver untuk papan PCIe khusus di Linux, dan algoritme untuk merutekan lalu lintas antar papan belum menunjukkan dirinya sebagai masalah di masa lalu, kecuali jika Anda memiliki kasus penggunaan yang sangat tidak biasa - transfer yang sangat lama dengan persyaratan latensi hampir waktu nyata (dalam hal ini Anda tidak boleh menggunakan PCIe).
Apa yang secara langsung dapat memengaruhi jenis kinerja ini, dan jauh lebih mudah ditangani, adalah topologi bus itu sendiri, meskipun dampaknya biasanya hampir tidak dapat diukur.
Di mesin, jalankan perintah lspci sebagai:
lspci -tv
Yang akan menunjukkan kepada Anda tampilan pohon dari antarmuka PCIe dan rute ke CPU yang mereka ambil. Pada sebagian besar prosesor, Anda akan memiliki beberapa slot yang langsung menuju ke CPU dan lainnya melalui chip jembatan (lihat chipset Intel x99
Jembatan ini memperkenalkan latensi dan kemungkinan throughput yang lebih lambat. CPU langsung dikonfigurasikan secara khusus untuk perangkat berkinerja tinggi seperti kartu video. Ke poin awal Anda, jauh di dalam kode mikro prosesor mungkin ada pengoptimalan yang selanjutnya menurunkan tautan yang dijembatani. Untuk menggali lebih dalam dalam mengevaluasi performa dan perutean slot PCIe, lanjutkan di sysfs.
Di bawah /sys/bus/pci/slots/ akan ada daftar slot pci (fisik) di sistem Anda. Di dalamnya ada file virtual yang mengaitkan alamat bus <----> physicalslot.
Di bawah /sys/bus/pci/devices adalah daftar semua perangkat (di sinilah lspci mendapatkan infonya).
Menelusuri setiap perangkat, Anda dapat melihat semua informasi yang diekspos oleh kernel pada perangkat tersebut, driver yang terkait dengannya, CPU yang terkait dengan perangkat (pada banyak sistem CPU), antara lain.
Sunting - Saya tidak menyebutkan beberapa hal yang jelas yang saya anggap telah Anda kesampingkan, tetapi untuk berjaga-jaga:
1. Apakah slot yang berbeda keduanya memiliki jalur paling sedikit sebanyak papan?
2. Apakah ada perbedaan spesifikasi- misalnya papan adalah pcie 3, satu slot adalah 3 dan lainnya adalah 2?
3. Sudahkah Anda mendiskusikan masalah ini dengan vendor papan dan/atau pengembang driver di luar mereka yang mengakui iy? Mereka mungkin mengetahui beberapa kesalahan acak terkait hal itu
Jika Anda memberikan detail spesifik, saya dapat memberikan saran khusus.
Selain melihat topologi (apakah perangkat yang lebih cepat pada jalur CPU langsung, sedangkan yang lain tidak), tidak mengetahui jenis chipset / CPU yang Anda gunakan, saya hanya dapat menawarkan saran umum, tetapi tiga area yang akan saya mulai cari di adalah:
Latensi Interupsi:Jika interupsi untuk papan dikaitkan dengan CPU/inti yang menangani perangkat lain dengan tingkat interupsi tinggi, Anda akan mengalami penurunan kinerja. Apakah ada pengangkatan berat konteks kernel lain yang terjadi pada inti itu? tonton /proc/interrupts untuk melihat apa modul kernel lain yang menggunakan CPU itu untuk penanganan interupsi dan jumlah/tingkat kemunculannya. Coba sesuaikan afinitas CPU untuk perangkat itu di /proc/irw ... smp_affinity. afinitas smp adalah topeng, jika Anda memiliki 8 inti dan tidak menentukan apa pun, itu akan disetel ke FF (8 1). Jika Anda menyetelnya ke, mis. 0x02, itu akan memaksa Core 2 untuk menangani IRQ. Kecuali Anda tahu bahwa Anda sedang menangani masalah tertentu, memaksakan perubahan ini dapat dengan mudah memperburuk keadaan.
Dukungan interupsi:Lihat dan lihat apakah salah satu perangkat menggunakan interupsi MSI-x atau MSI, sementara yang lain menggunakan interupsi standar (listrik). Kadang-kadang jembatan tidak mendukung implementasi papan MSI (MSI berarti interupsi sinyal pesan - daripada interupsi listrik, itu hanya paket yang dikirim melalui bus itu sendiri). Jika suatu perangkat biasanya menggunakan beberapa interupsi tetapi harus beroperasi hanya dengan satu interupsi karena hal ini, perangkat akan sulit dideteksi kecuali Anda mencarinya secara langsung, dan dapat menyebabkan masalah performa.
Mencirikan kinerja. Ada banyak alat di kernel untuk mengumpulkan data kinerja. Satu hal yang mereka semua miliki adalah bahwa mereka didokumentasikan dengan buruk dan umumnya tidak didukung. Tetapi dengan itu, saya akan melihat penggunaan Ftrace untuk mengkarakterisasi transfer dma dari setiap papan, dan latensi IRQ untuk masing-masing. Anda bisa mendapatkan informasi statistik serta detail spesifik tentang peristiwa outlier. Anda dapat mulai memeriksanya di sini:http://elinux.org/Ftrace
Secara umum saya sangat tidak menganjurkan menyia-nyiakan dalam pengaturan tingkat yang sangat rendah tanpa pemahaman selengkap mungkin tentang apa yang Anda coba perbaiki (bukan gejala yang harus diperbaiki, tetapi akar penyebab yang mendasarinya). 99% dari waktu Anda akhirnya akan memutar 'kenop' demi itu, tetapi tanpa memahami mengapa atau apa masalah aslinya, bagaimana mengevaluasi keefektifan pengaturan yang diberikan (baik langsung maupun dalam hal stabilitas jangka panjang) .
Saya banyak menggunakan ftrace untuk debug kernel umum dan sangat merekomendasikannya. Jika Anda ingin hal-hal diabstraksi sedikit, ada pembungkus di sekitar ftrace yang mengklaim membuatnya lebih mudah digunakan, tetapi saya menemukan abstraksi tambahan hanya membuat air menjadi keruh - trace-cmd, kernel shark, dll. Jika Anda menggunakan sistem topi merah Anda dapat melihat ke dalam systemtap - bukan hal yang sama tetapi dapat memberikan data yang serupa (dan didukung dengan baik).