Saya menjalankan beberapa tolok ukur. Runner benchmark saya memantau buffer dmesg di antara eksperimen, mencari apa saja yang dapat memengaruhi kinerja. Hari ini ia melemparkan ini:
[2015-08-17 10:20:14 PERINGATAN] dmesg tampaknya telah berubah! Diff berikut: --- 2015-08-17 09:55:00 +++ 2015-08-17 10:20:14 @@ -825,3 +825,4 @@ [3.802206] [drm] Mengaktifkan status RC6: RC6 on, RC6p off, RC6pp off [7.900533] r8169 0000: 06: 00.0 eth0: ditautkan [7.900541] IPv6: ADDRCONF (NETDEV_CHANGE): eth0: tautan menjadi siap + [236832.221937] interupsi terlalu lama (2504> 2500), menurunkan kernel.perf_event_max_sample_rate menjadi 50.000
Setelah beberapa pencarian, saya sekarang tahu ini berkaitan dengan subsistem profil di kernel linux yang disebut "perf". Saya rasa kami tidak memerlukan ini, jadi saya ingin menonaktifkannya sama sekali.
Mencari lagi, saya menemukan bahwa sysctl perf_cpu_time_max_percent
dapat membantu. Di sini seseorang menyarankan untuk menonaktifkan dengan menetapkannya ke 0. Membacanya lagi di sini :
perf_cpu_time_max_percent:
Petunjuk ke kernel berapa banyak waktu CPU yang harus diizinkan untuk digunakan untuk menangani peristiwa pengambilan sampel perf. Jika subsistem informasi diinformasikan bahwa sampelnya melebihi batas ini, ia akan menurunkan frekuensi samplingnya untuk mencoba mengurangi penggunaan CPU-nya.
Beberapa contoh perf terjadi di NMI. Jika sampel-sampel ini secara tak terduga membutuhkan waktu terlalu lama untuk dieksekusi, NMI dapat menjadi bertumpuk di samping satu sama lain sehingga tidak ada hal lain yang diizinkan untuk dieksekusi.
0: nonaktifkan mekanismenya. Jangan memantau atau memperbaiki laju pengambilan sampel perf, tidak peduli berapa lama waktu yang diperlukan CPU.
1-100: upaya untuk membatasi laju sampel perf ke persentase CPU ini. Catatan: kernel menghitung panjang "yang diharapkan" dari setiap peristiwa sampel. 100 di sini berarti 100% dari panjang yang diharapkan. Bahkan jika ini diatur ke 100, Anda mungkin masih melihat pelambatan sampel jika panjang ini terlampaui. Set ke 0 jika Anda benar-benar tidak peduli berapa banyak CPU yang dikonsumsi.
Bagi saya ini seperti 0 berarti laju sampel profiling tidak lagi diperiksa, tetapi subsistem freq tetap berjalan (?).
Adakah yang bisa menjelaskan bagaimana cara menonaktifkan profil kernel dengan freq?
EDIT: Seseorang menyarankan saya mencoba membangun kernel tanpa perf, tapi saya rasa ini tidak mungkin. Opsi ini tampaknya tidak dapat dialihkan:
EDIT2: Setelah lebih banyak membaca, saya memutuskan saya mungkin dapat mengatur kernel.perf_event_max_sample_rate
ke nol. Yaitu tidak ada sampel per detik. Namun, Anda tidak dapat melakukan ini ( sumber ):
komit 02f98e3e36da106338b7c732fed516420fb20e2a Penulis: Knut Petersen Tanggal: Rab 25 Sep 14:29:37 2013 +0200 perf: Menerapkan 1 sebagai batas bawah untuk perf_event_max_sample_rate
EDIT 3: FWIW, perf_cpu_time_max_percent
diatur ke 25, yang berarti kernel menghabiskan lebih dari 25% dari register perangkat keras pengambilan sampel waktunya. Ini tidak dapat diterima untuk mesin pembandingan.
Saya sekarang yakin bahwa pengaturan perf_cpu_time_max_percent
ke nol hanya akan memperburuk situasi, karena kernel akan terus menggunakan lebih dari 25% dari waktunya membaca register perangkat keras. Kesalahan menyala untuk menyesuaikan laju sampel, sehingga berusaha memastikan bahwa kernel memenuhi kuota penggunaan <25% dari waktunya dalam perf. 25% IMHO masih terlalu tinggi.
Jika saya benar-benar tidak dapat menonaktifkan perf, mungkin kompromi terbaik adalah mengatur perf_event_max_sample_rate
ke 1.
EDIT4: Seorang teman menyarankan agar saya salah mengartikan makna perf_cpu_time_max_percent
, jadi pernyataan di atas mungkin salah. Nilai 25 menunjukkan bahwa kernel menggunakan lebih dari 25% dari beberapa panjang sewenang-wenang yang telah dicadangkan untuk melayani gangguan inter.
EDIT5:
Seperti yang ditunjukkan dalam komentar, opsi -*-
menentang perf menunjukkan bahwa fitur dipaksa oleh fitur diaktifkan lainnya. Jika saya melihat ke dalam help
, ia mengatakan fitur mana yang adalah:
Saya tidak berpikir saya bisa menang di sini. Formula Boolean selected by
mengatakan
Jika Anda menargetkan X86, atau ...
Saya baru saja memeriksa bahwa penargetan X86_64 memang memungkinkan CONFIG_X86
. Jadi sepertinya begitu Anda menargetkan X86 atau X86_64, Anda mendapatkan perf.
Jadi saya ingin sedikit mengubah pertanyaan saya menjadi:
Pengaturan perf mana yang dapat saya gunakan untuk meminimalkan waktu yang dihabiskan oleh kernel dalam rutinitas perf?
Ingatlah bahwa tujuan keseluruhan adalah untuk mengendalikan sumber variasi acak untuk pembandingan. Jika saya tidak dapat menonaktifkan perf, bagaimana saya bisa meminimalkan dampaknya pada tolok ukur?
CONFIG_HAVE_PERF_EVENTS=y
dan CONFIG_PERF_EVENTS=y
. Saya tidak berpikir ini cacat perf.
-*-
berarti bahwa beberapa subsistem tergantung pada modul perf. Help
memperlihatkan pohon dependensi yang harus Anda nonaktifkan untuk mengubah opsi menjadi [*]
atau [M]
.