Berapa banyak Konteks Konteks yang "normal" (sebagai fungsi inti CPU (atau lainnya))?

34

Hi Linux / UNIX Overlords,

Apakah ada di antara Anda yang memiliki aturan praktis tentang berapa banyak saklar konteks (per inti prosesor) yang Normal pada server Linux?

Kuliah saya di sini membawanya, dan dia melihat 16K pada mesin 8-core x86_64.

Berikut adalah beberapa statistik dari sarface selama beberapa hari terakhir ...

alt teks http://src.autonomy.net.au/imagebin/81895e338fae67d3d205c09db44a81e6-Picture_10.png

Dan untuk melihat statistik proses pembuatan, berikut adalah tampilan logaritmik dari grafik yang sama ...

alt teks http://src.autonomy.net.au/imagebin/7481f7e52bead4effc90248fc23c72fe-Picture_11.png

Dan 8 core bosan sampai mati ...

alt teks http://src.autonomy.net.au/imagebin/0e94326652e977fd74edcd840f94200f-Picture_12.png

CS vs IOwait (skala x10000)

alt teks http://src.autonomy.net.au/imagebin/a52a2a8a120394849c0da4045933e306-Picture_13.png

Informasi lebih berguna jika ada yang bertanya ..

  • Penyimpanan yang bekerja pada server adalah 0.5TB SAN via FC
  • Ada 8GB RAM, kebanyakan cache - tidak ada pertukaran.
Xerxes
sumber
1
Dalam periode tertentu?
dmckee
Bisakah Anda lebih spesifik tentang beban kerja?
dmo
1
Bagaimana Anda membuat grafik itu? Terlihat sangat bagus!
Antoine Benkemoun
Hai Antoine - Grafik dibuat dari sarface ( projects.autonomy.net.au/sarface )
Xerxes
tautan grafik sudah mati seperti sekarang. @Xerxes dapatkah Anda sampai di sana dari suatu tempat?
törzsmókus

Jawaban:

25

Ini sangat tergantung pada jenis aplikasi yang Anda jalankan. Jika Anda memiliki aplikasi yang syscalls WRT yang sangat memicu-senang Anda dapat mengharapkan untuk melihat sejumlah besar pengalihan konteks. Jika sebagian besar aplikasi Anda menganggur dan hanya bangun ketika ada hal-hal yang terjadi pada soket, Anda dapat mengharapkan untuk melihat tingkat switch konteks rendah.

Panggilan sistem

Panggilan sistem menyebabkan perubahan konteks berdasarkan sifatnya sendiri. Ketika suatu proses melakukan panggilan sistem, itu pada dasarnya memberitahu kernel untuk mengambil alih dari titik waktu dan memori saat ini untuk melakukan hal-hal yang prosesnya tidak istimewa untuk dilakukan, dan kembali ke tempat yang sama ketika selesai.

Ketika kita melihat definisi dari syscall write (2) dari Linux, ini menjadi sangat jelas:

NAMA
       tulis - tulis ke deskriptor file

RINGKASAN
       #termasuk 

       ssize_t write (int fd, const void * buf, size_t count);

DESKRIPSI
       tulis () tulis hingga hitung byte dari buffer menunjuk buf ke file
       disebut oleh deskriptor file fd. [..]

NILAI KEMBALI
       Jika berhasil, jumlah byte yang ditulis dikembalikan (nol menunjukkan
       tidak ada yang tertulis). Pada kesalahan, -1 dikembalikan, dan errno diatur
       secara tepat.
       [..]

Ini pada dasarnya memberitahu kernel untuk mengambil alih operasi dari proses, naik ke countbyte, mulai dari alamat memori yang ditunjuk oleh *bufuntuk mengajukan deskriptor fddari proses saat ini dan kemudian kembali ke proses dan katakan padanya bagaimana prosesnya.

Contoh yang bagus untuk menunjukkan ini adalah server game khusus untuk game berbasis Valve Source, hlds . http://nopaste.narf.at/f1b22dbc9 menunjukkan syscalls senilai satu detik dilakukan oleh satu instance dari server game yang tidak memiliki pemain di dalamnya. Proses ini memakan waktu sekitar 3% waktu CPU pada Xeon X3220 (2.4Ghz), hanya untuk memberi Anda perasaan betapa mahal ini.

Multi-Penugasan

Sumber lain dari pengalihan konteks mungkin proses yang tidak melakukan syscall, tetapi perlu dipindahkan dari CPU yang diberikan untuk memberi ruang bagi proses lain.

Cara yang bagus untuk memvisualisasikan ini adalah cpuburn . cpuburn tidak melakukan syscalls itu sendiri, ia hanya mengulangi ingatannya sendiri, jadi seharusnya tidak menyebabkan perubahan konteks.

Ambil mesin siaga, mulai vmstat dan kemudian jalankan burnMMX (atau tes berbeda dari paket cpuburn) untuk setiap inti CPU yang dimiliki sistem. Anda harus memiliki pemanfaatan sistem penuh pada saat itu tetapi hampir tidak ada peningkatan konteks switching. Kemudian cobalah untuk memulai beberapa proses lagi. Anda akan melihat bahwa konteks switching rate meningkat ketika proses mulai bersaing dengan core CPU. Jumlah switching tergantung pada proses / rasio inti dan resolusi multitasking dari kernel Anda.

Bacaan lebih lanjut

linfo.org memiliki artikel bagus tentang konteks switch dan panggilan sistem . Wikipedia memiliki informasi umum dan koleksi tautan yang bagus tentang Panggilan sistem.

Michael Renner
sumber
1
Ini bermanfaat - Anda telah memberi saya ide bagus! =)
Xerxes
1
Pernyataan Anda System calls cause context switches by their very own naturesepertinya salah. Panggilan sistem menyebabkan mode beralih seperti yang dinyatakan oleh linfo.org/context_switch.html
Nicolas Labrot
6

server web saya yang memuat cukup sekitar 100-150 aktif per detik dengan puncak ke ribuan.

Tingkat peralihan konteks tinggi itu sendiri bukanlah masalah, tetapi mereka mungkin menunjukkan jalan menuju masalah yang lebih signifikan.

sunting: Sakelar konteks adalah gejala, bukan penyebab. Apa yang Anda coba jalankan di server? Jika Anda memiliki mesin multiprosesor, Anda mungkin ingin mencoba mengatur afinitas cpu untuk proses server utama Anda.

Atau jika Anda menjalankan X, coba turunkan ke mode konsol.

sunting lagi: pada 16k cs per detik, masing-masing cpu adalah rata-rata dua sakelar per milidetik - yaitu setengah hingga seperenam dari kutu waktu normal. Mungkinkah dia menjalankan banyak utas terikat IO?

edit lagi posting grafik: Jelas terlihat IO terikat. Apakah sistem menghabiskan sebagian besar waktunya di SYS ketika konteks switch tinggi?

sunting sekali lagi: iowait tinggi dan sistem dalam grafik terakhir itu - sepenuhnya memudarkan ruang pengguna. Anda memiliki masalah IO.
Kartu FC apa yang Anda gunakan?

edit: hmmm. ada kemungkinan mendapatkan beberapa tolok ukur terjadi pada akses SAN Anda dengan bonnie ++ atau dbench selama deadtime? Saya akan tertarik melihat apakah mereka memiliki hasil yang sama.

sunting: Telah memikirkan hal ini selama akhir pekan dan saya telah melihat patters penggunaan yang serupa ketika Bonnie melakukan pass "tulis byte pada suatu waktu". Itu mungkin menjelaskan jumlah besar peralihan yang terjadi, karena setiap penulisan akan membutuhkan syscall terpisah.

jay_dubya
sumber
Saya masih tidak yakin bahwa tingkat konteks-switch yang tinggi tidak masalah, saya berbicara tentang tinggi seperti pada 4K ke 16K, bukan 100-150.
Xerxes
Tidak ada server kami yang menjalankan X. Saya setuju dengan Anda tentang masalah tunggu IO, dan hubungan antara itu dan CS. Kartu HBA bukan tersangka karena kita menggunakan kartu yang sama pada ratusan server lainnya ... Kesimpulannya adalah saya menyalahkan tim SAN yang payah EVA SAN yang mereka coba-coba dan pertahankan sepanjang waktu. Perhatikan bahwa menunggu IO tinggi tidak selalu menjadi alasan untuk khawatir, jika sebagian besar proses pada mesin terikat IO, diharapkan server tidak akan melakukan hal yang lebih baik untuk melakukan putaran diam itu.
Xerxes
Pada detik kedua - grafik ke-4 terlampir menunjukkan bahwa itu tidak benar-benar sedekat saya pada awalnya. Bukan gerhana sama sekali. Saya masih menyalahkan SAN. =)
Xerxes
1

Saya lebih cenderung khawatir tentang tingkat hunian CPU dari status sistem. Jika mendekati 10% atau lebih tinggi, itu berarti OS Anda menghabiskan terlalu banyak waktu untuk beralih konteks. Meskipun memindahkan beberapa proses ke komputer lain jauh lebih lambat, itu layak untuk dilakukan.


sumber
1

Hal-hal seperti inilah mengapa Anda harus mencoba dan menjaga baseline kinerja untuk server Anda. Dengan begitu, Anda dapat membandingkan hal-hal yang tiba-tiba Anda perhatikan dengan hal-hal yang telah Anda rekam di masa lalu.

Yang mengatakan, saya memiliki server yang berjalan (server Oracle tidak terlalu sibuk, terutama), yang stabil sekitar 2k dengan beberapa puncak 4k. Untuk server saya, itu normal, untuk server orang lain yang mungkin terlalu rendah atau terlalu tinggi.

Seberapa jauh Anda bisa kembali ke data Anda?

Informasi CPU macam apa yang dapat Anda berikan kepada kami?

wzzrd
sumber
Saya pasti setuju dengan menjaga baseline, dan kami memiliki data nagios akan kembali untuk waktu yang lama - masalah dengan server ini adalah bahwa itu darah baru - hanya sekitar untuk sementara waktu. Selain itu, ini menjalankan perangkat lunak perusahaan (baca: omong kosong) - Teamsite - hanya untuk menambah daftar variabel yang tidak ditentukan. Saya masih lebih suka sar (preferensi pribadi) jadi saya akan mengkonfigurasinya untuk menyimpan lebih dari standar (2 minggu), dan lihat bagaimana kelanjutannya.
Xerxes
Menggunakan sar dalam kombinasi dengan rrdtool (yang terlihat seperti grafik Anda) dapat menjadi cara yang mudah untuk menyimpan data Anda (atau setidaknya abstraknya) untuk waktu yang lama.
wzzrd
0

Tidak ada aturan praktis. Switch konteks hanyalah CPU yang bergerak dari memproses satu utas ke yang lain. Jika Anda menjalankan banyak proses (atau beberapa yang sangat berulir) Anda akan melihat lebih banyak sakelar. Untungnya, Anda tidak perlu khawatir tentang berapa banyak konteks yang ada - biayanya kecil dan lebih atau lebih tidak dapat dihindari.

Alex J
sumber
6
Sebenarnya biaya pergantian konteks mahal . Ini bahkan terburuk pada mesin Virtual - kami melakukan beberapa pengujian beberapa bulan yang lalu yang menunjukkan bahwa salah satu penyebab terbesar kinerja VM adalah pengalihan konteks.
Xerxes
Bahkan, dalam sistem operasi modern (multi-tasking) apa pun, minimalisasi pengalihan konteks adalah tugas pengoptimalan yang sangat signifikan. Apakah Anda memiliki sumber untuk mendukung klaim Anda bahwa biayanya kecil?
Xerxes
Maaf, apakah Anda berbicara tentang meminimalkan sakelar konteks dari perspektif pengembangan OS? Tidak ada hubungannya dengan pengembangan seperti itu saya tidak memiliki pendapat tentang manfaat merancang sistem untuk meminimalkan CS :) Jika Anda berbicara tentang meminimalkan switch konteks pada server, masalahnya adalah mitigasi switch konteks memperkenalkan latensi di tempat lain. EG mengurangi jumlah proses pada mesin berarti Anda harus memindahkan proses ini ke mesin lain, yang berarti komunikasi terjadi melalui jaringan, yang jauh lebih lambat!
Alex J
Saya percaya definisi Anda tentang sakelar konteks salah; mereka juga terjadi ketika panggilan sistem dilakukan, bahkan jika itu kembali ke utas yang sama. Aplikasi mengoptimalkan hal ini dengan melakukan berbagai trik. Misalnya Apache perlu mendapatkan waktu sistem sangat sering; untuk tujuan itu utas menelepon localtime berulang kali dan menyimpan hasilnya dalam memori bersama. Utas lainnya hanya perlu membaca dari RAM dan tidak dikenakan sakelar proses saat melakukannya.
niXar