GNU/Linux >> Belajar Linux >  >> Linux

Pengantar Interupsi Linux dan CPU SMP Affinity

Interupsi adalah sinyal yang dikirim melalui IRQ (Interrupt Request Line) oleh perangkat keras atau perangkat lunak.

Interupsi memungkinkan perangkat seperti keyboard, kartu serial, dan port paralel menunjukkan bahwa perangkat tersebut memerlukan perhatian CPU.

Setelah CPU menerima Interrupt Request, CPU akan menghentikan sementara eksekusi program yang sedang berjalan dan menjalankan program khusus yang disebut Interrupt Handler atau ISR (Interrupt Service Routine).

Interrupt Service atau Interrupt Handler Routine dapat ditemukan dalam tabel Interrupt Vector yang terletak di alamat tetap di memori. Setelah interupsi ditangani, CPU melanjutkan program yang terputus.

Pada saat boot, sistem mengidentifikasi semua perangkat, dan penangan interupsi yang sesuai dimuat ke dalam tabel interupsi.

Berikut ini adalah dua cara meminta perhatian CPU:

  1. Berbasis interupsi
  2. Berbasis polling

Semua OS berbasis Linux digerakkan oleh interupsi.

Saat kita menekan tombol pada keyboard, keyboard mengatakan kepada CPU bahwa tombol telah ditekan. Tetapi CPU dapat sibuk memproses beberapa hal dari RAM, Jam Sistem, kartu NIC, mungkin video atau bus PCI. Dalam hal ini Keyboard menempatkan tegangan pada saluran IRQ yang ditetapkan untuk perangkat keras itu, di sini dalam hal ini [Keyboard]. Perubahan tegangan ini berfungsi sebagai permintaan dari perangkat yang mengatakan bahwa perangkat memiliki permintaan yang perlu diproses.

/proc/interrupts File

Pada mesin Linux, file /proc/interrupts berisi informasi tentang interupsi yang digunakan dan berapa kali prosesor telah diinterupsi

# cat /proc/interrupts
           CPU0   CPU1  CPU2  CPU3
  0: 3710374484      0     0     0  IO-APIC-edge  timer
  1:         20      0     0     0  IO-APIC-edge  i8042
  6:          5      0     0     0  IO-APIC-edge  floppy
  7:          0      0     0     0  IO-APIC-edge  parport0
  8:          0      0     0     0  IO-APIC-edge  rtc
  9:          0      0     0     0  IO-APIC-level  acpi
 12:        240      0     0     0  IO-APIC-edge  i8042
 14:   11200026      0     0     0  IO-APIC-edge  ide0
 51:   61281329      0     0     0  IO-APIC-level  ioc0
 59:          1      0     0     0  IO-APIC-level  vmci
 67:   19386473      0     0     0  IO-APIC-level  eth0
 75:   94595340      0     0     0  IO-APIC-level  eth1
NMI:          0      0     0     0
LOC: 3737150067 3737142382 3737145101 3737144204
ERR:          0
MIS:          0

Dalam file di atas:

  • Kolom pertama adalah nomor IRQ.
  • Kolom Kedua menyatakan berapa kali inti CPU telah diinterupsi. Dalam contoh di atas timer adalah nama interupsi [Jam sistem] dan 3710374484 adalah berapa kali CPU0 diinterupsi. I8042 adalah pengontrol Keyboard yang mengontrol keyboard dan mouse PS/2 di PC.
  • Untuk interupsi seperti rtc [Real time clock] CPU tidak diinterupsi. RTC hadir di perangkat elektronik untuk melacak waktu.
  • NMI dan LOC adalah driver yang digunakan pada sistem yang tidak dapat diakses/dikonfigurasi oleh pengguna.

Nomor IRQ menentukan prioritas interupsi yang perlu ditangani oleh CPU.

Nilai angka IRQ yang kecil berarti prioritas yang lebih tinggi.

Misalnya jika CPU menerima interupsi dari Keyboard dan jam sistem secara bersamaan. CPU akan melayani System Clock terlebih dahulu karena memiliki nomor IRQ 0.

  • IRQ 0 — pengatur waktu sistem (tidak dapat diubah);
  • IRQ 1 — pengontrol keyboard (tidak dapat diubah)
  • IRQ 3 — pengontrol port serial untuk port serial 2 (dibagi dengan port serial 4, jika ada);
  • IRQ 4 — pengontrol port serial untuk port serial 1 (dibagi dengan port serial 3, jika ada);
  • IRQ 5 — port paralel 2 dan 3 atau kartu suara;
  • IRQ 6 — pengontrol floppy disk;
  • IRQ 7 — port paralel 1. Digunakan untuk printer atau port paralel apa pun jika tidak ada printer.

Untuk perangkat seperti joystick, CPU tidak menunggu perangkat mengirim interupsi. Karena Joystick yang digunakan untuk bermain game dan pergerakan joystick akan cepat, sangat ideal untuk menggunakan polling dan memeriksa apakah perangkat memerlukan perhatian. Kerugian di balik metode ini adalah CPU dapat menjadi sibuk menunggu, memeriksa perangkat berkali-kali.

Pada catatan terkait, penting juga untuk menangani sinyal dengan benar di Linux.

Interupsi Perangkat Keras

Semua skenario yang dibahas di atas adalah contoh interupsi Perangkat Keras.

Interupsi perangkat keras diklasifikasikan lebih lanjut ke dalam dua kategori utama:

  1. Non-maskable interrupts [NMI]:Seperti namanya, jenis interupsi ini tidak dapat diabaikan atau ditekan oleh CPU. MNI dikirim melalui jalur interupsi terpisah dan umumnya digunakan untuk kesalahan perangkat keras kritis seperti kesalahan memori, perangkap Perangkat Keras yang menunjukkan kegagalan Kipas, kegagalan Sensor Suhu, dll.
  2. Interupsi yang dapat disembunyikan:Interupsi ini dapat diabaikan atau ditunda oleh CPU. Register Topeng Interupsi menutupi interupsi yang dipicu pada pin eksternal pengontrol cache. Menyetel sedikit dengan menulis 0, menonaktifkan pemicu interupsi pada pin

Interupsi Perangkat Lunak

Interupsi ini dihasilkan ketika CPU mengeksekusi instruksi yang dapat menyebabkan kondisi pengecualian di CPU [unit ALU] itu sendiri.

Misalnya, membagi angka dengan nol yang tidak mungkin, itu akan menyebabkan pengecualian bagi-dengan-nol, menyebabkan komputer mengabaikan perhitungan atau menampilkan pesan kesalahan.

File /proc/stat juga merupakan bagian file dari sistem file /proc, yang memiliki informasi tentang statistik kernel sistem, juga menyimpan beberapa informasi interupsi.

# cat /proc/stat
cpu  17028082 5536753 5081493 1735530500 42592308 90006 479750 0
cpu0 5769176 1170683 1495750 403368354 39406374 90006 284864 0
cpu1 3714389 1451937 1186134 444082258 1084780 0 64876 0
cpu2 3791544 1471013 1211868 443988514 1056981 0 64764 0
cpu3 3752971 1443119 1187740 444091373 1044172 0 65244 0
intr 417756956 --- Output Truncated

Baris intr menunjukkan jumlah interupsi yang dilayani sejak waktu boot. Kolom pertama adalah total dari semua interupsi yang dilayani. Setiap kolom berikutnya adalah total untuk interupsi tertentu.

SMP_AFFINITY

Multiprocessing simetris adalah pemrosesan program oleh beberapa prosesor.

File smp_affinity menyimpan nilai afinitas interupsi untuk nomor IRQ. File smp_affinity yang terkait dengan setiap nomor IRQ disimpan di file /proc/irq/IRQ_NUMBER/smp_affinity. Nilai dalam file disimpan dalam bit-mask heksadesimal yang mewakili semua inti CPU dalam sistem. smp_affinity berfungsi untuk perangkat yang memiliki driver perangkat berkemampuan IO-APIC.

Misalnya, entri smp_affinity untuk driver Ethernet ditunjukkan di bawah ini:

grep eth0 /proc/interrupts
67: 23834931 0 0 0 IO-APIC-level eth0

Nomor IRQ untuk eth0 adalah 67 dan file smp_affinity yang sesuai terletak di:

cat /proc/irq/67/smp_affinity
00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001

Setara desimal untuk nilai '000000001' adalah '1'. yaitu Semua interupsi yang terkait dengan driver Ethernet akan dilayani oleh CPU0.

Kita dapat mengubah afinitas prosesor secara manual dengan mengubah nilai dalam file smp_affinity untuk pengontrol tertentu atau dengan menggunakan irqbalance.

Saldo IRQ

Irqbalance adalah utilitas Linux yang mendistribusikan interupsi melalui inti prosesor di sistem komputer Anda yang membantu meningkatkan kinerja.

Tujuan Irqbalance adalah untuk menemukan keseimbangan antara penghematan daya dan kinerja yang optimal.

Jika irqbalance tidak diinstal pada sistem Anda, instal menggunakan yum seperti yang ditunjukkan di bawah ini.

# rpm -qa | grep irqbalance
irqbalance-0.55-15.el5

# yum search irqbalance

# yum install irqbalance.x86_64

Mulai layanan irqbalance:

service irqbalance start

Berikut ini adalah contoh output dari mesin Linux tempat irqbalance diinstal. Kita bisa melihat bahwa interupsi sekarang sedang didistribusikan antar CPU.

# cat /proc/interrupts
           CPU0     CPU1      CPU2       CPU3
  0:  950901695        0         0          0  IO-APIC-edge  timer
  1:         13        0         0          0  IO-APIC-edge  i8042
  6:         96    10989       470          0  IO-APIC-edge  floppy
  7:          0        0         0          0  IO-APIC-edge  parport0
  8:          1        0         0          0  IO-APIC-edge  rtc
  9:          0        0         0          0  IO-APIC-level  acpi
 12:        109     1787         0          0  IO-APIC-edge  i8042
 15:         99 84813914         0          0  IO-APIC-edge  ide1
 51:      17371        0  46689970          0  IO-APIC-level  ioc0
 67:       1741        0         0  225409160  PCI-MSI  eth0
 83:          0        0         0          0  PCI-MSI  vmci
NMI:          0        0         0          0
LOC:  950902917  950903742  950901202  950901400
ERR:          0
MIS:          0

Irqbalance sangat berguna pada sistem dengan prosesor multi-inti, karena interupsi biasanya hanya akan dilayani oleh inti pertama.


Linux
  1. Pengantar perintah Linux chgrp dan newgrp

  2. Linux – Bagaimana Membatasi Proses Ke Satu Cpu Core Di Linux??

  3. Penggunaan CPU Linux dan Riwayat Eksekusi Proses

  1. Ambil penggunaan CPU dan penggunaan memori dari satu proses di Linux?

  2. Bagaimana Interupsi ditangani di Linux?

  3. Bagaimana cara membatasi proses ke satu inti CPU di Linux?

  1. Bagaimana kernel Linux menangani interupsi

  2. Memantau host Linux dan Windows dengan Glances

  3. Pengantar bpftrace untuk Linux