Şu anda sistemimizi RHEL 5'ten RHEL 6'ya taşımak istiyorum, ancak RHEL 6 makinelerinde beklenmedik derecede yüksek CPU kullanımı ile bir engelle karşılaştım. Bunun en azından kısmen select
kesilebilir bir uyku yapmaktan kaynaklanabileceği anlaşılıyor . Davranışı gösteren basit bir örnek:
#include <sys/select.h>
int main()
{
timeval ts;
for (unsigned int ii=0; ii<10000; ++ii) {
ts.tv_sec = 0;
ts.tv_usec = 1000;
select(0, 0, 0, 0, &ts);
}
return 0;
}
Bir RHEL 5 makinesinde% 0 CPU kullanımında kalacaktır, ancak RHEL 6 yüklü olan aynı donanımda CPU'nun yaklaşık% 0,5'ini kullanacaktır, bu nedenle 30 ila 50 program select
bir uyku yapmak için çalışırken , büyük miktarda CPU gereksiz yere.
Bir Bugzilla açtım ve OProfile çalıştırmayı denedim ve sadece uygulama için ana% 100 ve çekirdeğe bakarken poll_idle'ın% 99'undan fazlasını gösteriyor (her şeyin yakalanabilmesi için boşta = anket ayarladım).
Daha yüksek CPU kullanımının sebebinin ne olduğunu denemek ve izole etmek için ne yapabilirim?
GÜNCELLEME: Perf aracını buldum ve aşağıdaki çıktıyı aldım:
# Events: 23K cycles
#
# Overhead Command Shared Object Symbol
# ........ ....... ................... ....................................
#
13.11% test_select_sma [kernel.kallsyms] [k] find_busiest_group
5.88% test_select_sma [kernel.kallsyms] [k] schedule
5.00% test_select_sma [kernel.kallsyms] [k] system_call
3.77% test_select_sma [kernel.kallsyms] [k] copy_to_user
3.39% test_select_sma [kernel.kallsyms] [k] update_curr
3.22% test_select_sma ld-2.12.so [.] _dl_sysinfo_int80
2.83% test_select_sma [kernel.kallsyms] [k] native_sched_clock
2.72% test_select_sma [kernel.kallsyms] [k] find_next_bit
2.69% test_select_sma [kernel.kallsyms] [k] cpumask_next_and
2.58% test_select_sma [kernel.kallsyms] [k] native_write_msr_safe
2.47% test_select_sma [kernel.kallsyms] [k] sched_clock_local
2.39% test_select_sma [kernel.kallsyms] [k] read_tsc
2.26% test_select_sma [kernel.kallsyms] [k] do_select
2.13% test_select_sma [kernel.kallsyms] [k] restore_nocheck
Daha yüksek CPU kullanımı zamanlayıcıdan geliyor gibi görünüyor. Ben de bunlardan 100 tanesini aynı anda başlatmak için aşağıdaki bash betiğini kullandım:
#!/bin/bash
for i in {1..100}
do
./test_select_small &
done
RHEL 5'te CPU kullanımı% 0'a yakındır, ancak RHEL 6'da hem kullanıcı hem de sistemde önemsiz miktarda CPU kullanımı vardır. Bunun gerçek kaynağını nasıl izleyeceğiniz ve umarım düzeltebileceğiniz hakkında herhangi bir fikir var mı?
Ayrıca bu testi mevcut bir Arch Linux yapısında ve Ubuntu 11.10'da denedim ve benzer davranışlar gördüm, bu yüzden bu sadece bir RHEL sorunu değil, bir tür çekirdek sorunu gibi görünüyor.
GÜNCELLEME2: Büyük bir tartışma olduğunu biliyorum çünkü bunu gündeme getirmek için biraz tereddüt ediyorum, ancak Ubuntu 11.10'daki BFS yamalarıyla bir çekirdek denedim ve aynı yüksek sistem CPU kullanımını göstermedi (kullanıcı cpu kullanımı hakkında görünüyordu aynısı).
Bu yüksek CPU kullanımının yapay olarak yüksek görünmesini sağlayan CPU kullanımının hesabında sadece bir fark olup olmadığını test etmek için her biri ile çalışabileceğim bazı testler var mı? Veya gerçek CPU döngüleri CFS tarafından çalınıyorsa?
GÜNCELLEME3: Bu soruyu içeren analiz, bunun zamanlayıcı ile ilgili bir şey olduğunu gösteriyor gibi görünüyor, bu yüzden sonuçları tartışmak için yeni bir soru oluşturdum .
GÜNCELLEME4: Diğer soruya biraz daha bilgi ekledim .
GÜNCELLEME5: Diğer soruya , sorunu hala gösteren daha basit bir testten bazı sonuçlar ekledim .
select
?