Mengisolasi penyebab penggunaan CPU yang lebih tinggi pada RHEL 6 vs RHEL 5


9

Saat ini saya ingin memindahkan sistem kami dari RHEL 5 ke RHEL 6, tetapi saya mengalami kesulitan dengan penggunaan CPU yang sangat tinggi pada mesin RHEL 6. Tampaknya ini mungkin disebabkan setidaknya sebagian karena penggunaan selectuntuk melakukan tidur yang terputus. Berikut adalah contoh sederhana yang menunjukkan perilaku:

#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;
}

Pada mesin RHEL 5 itu akan tetap pada penggunaan CPU 0%, tetapi pada perangkat keras yang sama dengan RHEL 6 diinstal akan menggunakan sekitar 0,5% dari CPU, jadi ketika 30 hingga 50 program berjalan menggunakan selectuntuk melakukan tidur itu memakan CPU dalam jumlah besar tidak perlu.

Saya membuka Bugzilla dan saya mencoba menjalankan OProfile dan itu hanya menunjukkan 100% di utama untuk aplikasi dan lebih dari 99% di poll_idle ketika melihat kernel (saya punya idle = jajak pendapat diatur dalam opsi grub saya sehingga semuanya dapat ditangkap).

Adakah ide lain yang bisa saya lakukan untuk mencoba dan mengisolasi apa penyebab penggunaan CPU yang lebih tinggi?

UPDATE: Saya menemukan alat perf dan mendapat output berikut:

# 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

Tampaknya penggunaan CPU lebih tinggi dari penjadwal. Saya juga menggunakan skrip bash berikut untuk memulai 100 skrip secara bersamaan:

#!/bin/bash

for i in {1..100}
do
  ./test_select_small &
done

Pada RHEL 5 penggunaan CPU tetap mendekati 0%, tetapi pada RHEL 6 ada jumlah non-sepele penggunaan CPU di kedua pengguna dan sistem. Ada ide tentang cara melacak sumber sebenarnya dari ini dan mudah-mudahan memperbaikinya?

Saya juga mencoba tes ini pada Arch Linux build saat ini dan Ubuntu 11.10 dan melihat perilaku yang serupa, jadi ini tampaknya merupakan beberapa jenis masalah kernel dan bukan hanya masalah RHEL.

UPDATE2: Saya agak ragu untuk membahas hal ini karena saya tahu ini adalah perdebatan besar, tapi saya mencoba kernel dengan patch BFS di Ubuntu 11.10 dan tidak menunjukkan penggunaan CPU sistem tinggi yang sama (penggunaan cpu pengguna tampak seperti sama).

Apakah ada beberapa tes yang dapat saya jalankan dengan masing-masing untuk menguji apakah penggunaan CPU yang tinggi ini hanya perbedaan dalam akuntansi penggunaan CPU yang membuatnya tampak sangat tinggi? Atau jika siklus CPU aktual dicuri oleh CFS?

UPDATE3: Analisis yang dilakukan melibatkan pertanyaan ini tampaknya menunjukkan bahwa itu adalah sesuatu yang berkaitan dengan penjadwal, jadi saya membuat pertanyaan baru untuk membahas hasilnya.

UPDATE4: Saya menambahkan beberapa informasi lagi ke pertanyaan lain .

UPDATE5: Saya menambahkan beberapa hasil ke pertanyaan lain dari tes sederhana yang masih menunjukkan masalah.


Sepertinya RedHat telah menunjukkan ini ke GLibC. Apakah Anda mencari perubahan kode di selectsana?
Nils

Kategorisasi glibc dilakukan oleh saya ketika saya awalnya mengirimkan bugzilla.
Dave Johansen

Kedengarannya masuk akal bagi saya (bukan masalah Kernel). Apakah Anda mendapatkan hasil yang serupa dengan beberapa tidur bersamaan? Apa Versi glibc dari Ubuntu 11.10, Arch Linux dan RHEL6?
Nils

Ya, hasil yang sama dengan jajak pendapat dan tidur tidur selama 1 ms. Sejauh glibc, RHEL 5 adalah 2.5, RHEL 6 adalah 2.12, Ubuntu 11.10 adalah 2.13, dan saya percaya arch adalah 2.15 tetapi saya harus memeriksa.
Dave Johansen

Tampaknya Anda menemukan sendiri jawaban untuk pertanyaan asli ini. Posting sebagai jawaban di sini dan dapatkan poin Anda untuk itu!
Nils

Jawaban:


1

Anda bertanya:

Apakah ada beberapa tes yang dapat saya jalankan dengan masing-masing untuk menguji apakah penggunaan CPU yang tinggi ini hanya perbedaan dalam akuntansi penggunaan CPU yang membuatnya tampak sangat tinggi? Atau jika siklus CPU aktual dicuri oleh CFS?

Bagaimana jika Anda menjalankan benchmark CPU saat menjalankan test_select_smallprogram Anda , dan melihat apakah kinerjanya berubah tergantung pada versi OS host?

Ada banyak pilihan: saran klasik selalu "gunakan sesuatu yang mewakili jenis beban yang akan Anda miliki". Tapi anak-anak keren selalu menggunakan povray


1
Saya pikir itu adalah ide yang saya maksudkan. Apakah Anda memiliki rekomendasi aplikasi benchmark yang memberikan hasil waktu yang konsisten yang bisa saya gunakan?
Dave Johansen

@DaveJohansen - menambahkan catatan pada povray
ckhan

Sayangnya, kecuali jika disertai dengan RHEL, diperlukan setidaknya satu atau dua minggu untuk mendapatkan perangkat lunak apa pun pada sistem ini. Saya membuat program pengujian kecil saya sendiri dan membuat pertanyaan baru untuk membahas hasilnya.
Dave Johansen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.