Linux'ta hangi görevin çok fazla bağlam anahtarı oluşturduğunu öğrenin


11

Vmstat'a göre, Linux sunucum (2xCore2 Duo 2.5 GHz) saniyede yaklaşık 20k bağlam anahtarı yapıyor.

# vmstat 3
procs -----------memory----------  ---swap-- -----io----  -system-- ----cpu----
 r  b   swpd   free   buff  cache    si   so    bi    bo   in    cs us sy id wa
 2  0   7292 249472  82340 2291972    0    0     0     0    0     0  7 13 79  0
 0  0   7292 251808  82344 2291968    0    0     0   184   24 20090  1  1 99  0
 0  0   7292 251876  82344 2291968    0    0     0    83   17 20157  1  0 99  0
 0  0   7292 251876  82344 2291968    0    0     0    73   12 20116  1  0 99  0

... ancak uptimeküçük yük gösterir: load average: 0.01, 0.02, 0.01ve topyüksek CPU kullanımı ile herhangi bir işlem göstermez.

Bu bağlamsal anahtarları tam olarak neyin oluşturduğunu nasıl öğrenebilirim? Hangi süreç / iş parçacığı?

pidstatÇıktıları analiz etmeye çalıştım :

# pidstat -w 10 1

12:39:13          PID   cswch/s nvcswch/s  Command
12:39:23            1      0.20      0.00  init
12:39:23            4      0.20      0.00  ksoftirqd/0
12:39:23            7      1.60      0.00  events/0
12:39:23            8      1.50      0.00  events/1
12:39:23           89      0.50      0.00  kblockd/0
12:39:23           90      0.30      0.00  kblockd/1
12:39:23          995      0.40      0.00  kirqd
12:39:23          997      0.60      0.00  kjournald
12:39:23         1146      0.20      0.00  svscan
12:39:23         2162      5.00      0.00  kjournald
12:39:23         2526      0.20      2.00  postgres
12:39:23         2530      1.00      0.30  postgres
12:39:23         2534      5.00      3.20  postgres
12:39:23         2536      1.40      1.70  postgres
12:39:23        12061     10.59      0.90  postgres
12:39:23        14442      1.50      2.20  postgres
12:39:23        15416      0.20      0.00  monitor
12:39:23        17289      0.10      0.00  syslogd
12:39:23        21776      0.40      0.30  postgres
12:39:23        23638      0.10      0.00  screen
12:39:23        25153      1.00      0.00  sshd
12:39:23        25185     86.61      0.00  daemon1
12:39:23        25190     12.19     35.86  postgres
12:39:23        25295      2.00      0.00  screen
12:39:23        25743      9.99      0.00  daemon2
12:39:23        25747      1.10      3.00  postgres
12:39:23        26968      5.09      0.80  postgres
12:39:23        26969      5.00      0.00  postgres
12:39:23        26970      1.10      0.20  postgres
12:39:23        26971     17.98      1.80  postgres
12:39:23        27607      0.90      0.40  postgres
12:39:23        29338      4.30      0.00  screen
12:39:23        31247      4.10     23.58  postgres
12:39:23        31249     82.92     34.77  postgres
12:39:23        31484      0.20      0.00  pdflush
12:39:23        32097      0.10      0.00  pidstat

Görünüşe göre bazı postgresql görevleri saniyede 10'dan fazla bağlam değişikliği yapıyor, ancak yine de hepsi 20k'a kadar çıkmıyor.

Bir cevap için nasıl daha derine ineceğine dair bir fikrin var mı?


Postgre ile ilgili şey, farklı pid yani tamamen farklı programlar olmasıdır.
Gopoi

Yanıtlar:


6

Oldukça ilginç bir durum. Gözlemlemeyi deneyin watch -tdn1 cat /proc/interrupts. Orada değerli değişiklikler görüyor musunuz?


"Yerel zamanlayıcı kesintileri" her CPU çekirdeğinde birkaç yüz (200-800) kesinti üretiyor. Bu ne anlama geliyor? Ayrıca eth0-rx / tx, sunucudaki trafik nedeniyle bazı kesintiler üretiyor, ancak bu çok fazla değil.
grzaks

"İşlev çağrısı kesintileri" ne dersiniz?
poige

10

Kullanmayı deneyin

pidstat -wt

'T' seçeneği dişleri de gösterir. Bağlam anahtarlarını yapan bir iş parçacığı olabilir.


1
çalışan pidstat -wt | sıralama -n -k4 daha iyidir.
Ismael Vacco

2

Daha yeni çekirdek sürümünde

sudo perf record -e context-switches -a  # record the events

# then ctrl+c

sudo perf report # inspect the result

Bu size bağlam anahtarlama olayları hakkında kesin sonuç verecektir.

Ve bağlam anahtarlarının nedenini "-g" bayrakları ekleyerek bulabilirsiniz (okunabilir sonuç sembol bilgileri tarafından belirlenir)

sudo perf record -e context-switches -a -g

1

Bağlam anahtarı normal. Bir işlem bir miktar zamana atanır, eğer bitirirse (veya kaynaklara ihtiyaç duyulması nedeniyle duraklatılırsa) yapması gereken şey işlemcinin gitmesine izin verebilir.

Kaç bağlam anahtarının yapıldığını saymak söylenir (bir stackoverflow.com cevapları haline gelir), süreç tablolarına yazmak için iç çekirdek zamanlama () komutunu alır. A, eğer kendi çekirdeğinizi programlarsanız, görebileceğiniz bir şey yoktur, ancak oldukça zordur.


1
İyi. Bağlam anahtarının ne olduğunu ve sistem performansı için ne gibi etkileri olduğunu biliyorum. Sadece linux üzerinde hangi işlemlere kaç bağlam anahtarının yapıldığını ölçmenin bir yoluna ihtiyacım var. Zaten / proc / * / stats (voluntary_ctxt_switches)
grzaks

0

powertop bir işlemin CPU'yu ne sıklıkla uyandırdığını söyleyebilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.