Linux I / O bottleneck dengan penggerak data

8

Saya memiliki mesin 24 inti dengan 94.6GiB RAM yang menjalankan server Ubuntu 10.04. Kotak mengalami% iowait tinggi, tidak seperti server lain yang kami miliki (4 core) menjalankan jenis dan jumlah proses yang sama. Kedua mesin terhubung ke server file VNX Raid, mesin 24-core melalui 4 kartu FC, dan yang lainnya melalui 2 kartu ethernet 2 gigabit. Mesin 4-core saat ini mengungguli mesin 24-core, memiliki penggunaan CPU yang lebih tinggi dan% iowait yang lebih rendah.

Dalam 9 hari uptime,% iowait rata-rata 16%, dan secara rutin di atas 30%. Sebagian besar waktu penggunaan CPU sangat rendah, sekitar 5% (karena iowait tinggi). Ada banyak memori bebas.

Satu hal yang saya tidak mengerti adalah mengapa semua data tampak melalui perangkat sdc daripada melalui penggerak data secara langsung:

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           6.11    0.39    0.75   16.01    0.00   76.74

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
sda               0.00         0.00         0.00       1232          0
sdb               0.00         0.00         0.00       2960          0
sdc               1.53        43.71        44.54   36726612   37425026
dm-0              0.43        27.69         0.32   23269498     268696
dm-1              1.00         1.86         7.74    1566234    6500432
dm-2              0.96         1.72         5.97    1442482    5014376
dm-3              0.49         9.57         0.18    8040490     153272
dm-4              0.00         0.00         0.00       1794         24
dm-5              0.00         0.00         0.00        296          0

Bagian lain dari teka-teki adalah bahwa tugas-tugas yang sering masuk ke mode tidur yang tidak dapat dihentikan (di atas), juga mungkin karena penahanan io.

Apa yang bisa saya lihat untuk membantu mendiagnosis masalah? Mengapa semua data melalui / dev / sdc? Apakah itu normal?

MEMPERBARUI:

Koneksi jaringan dan kapasitas baca / tulis VNX telah dikesampingkan sebagai hambatan. Kami dapat mencapai kecepatan 800MB / s dengan 4 NIC terikat (round-robin). Kartu saluran serat belum digunakan. VNX mampu menangani IO (RAID6, 30x2TB 7.2kRPM disk per kumpulan dalam dua kumpulan (total 60 disk), sekitar 60% dibaca).

Abaikan di atas tentang dm dan sdc, mereka semua adalah disk internal, dan bukan bagian dari masalah.

Kami pikir masalahnya mungkin dengan nfs mounts atau TCP (kami memiliki 5 mounts hingga 5 partisi di VNX), tetapi tidak tahu apa sebenarnya. Ada saran?

Benjamin
sumber
Satu poin kecil: Dalam konteks ini, dmsingkatan dari perangkat mapper, bukan penggerak data. Pertanyaan ini mungkin akan jauh lebih baik di Server Fault.
Michael Hampton
Apakah Anda menggunakan NFSv4 atau NFSv3? Apakah iowait Anda hanya pada koneksi NFS, atau apakah Anda mendapatkannya saat menjalankan dd untuk menguji kecepatan disk (dengan asumsi Anda telah melakukan ini)? Jika Anda menunggu di NFS dan Anda menggunakan V4, coba V3. NFSv4 memiliki beberapa perilaku acak pada beban tinggi, dan kami baru-baru ini harus menonaktifkannya di seluruh jaringan kami.
Erik Aronesty

Jawaban:

6

Pertama-tama jika CPU Anda (dan sial! Itu banyak 24) makan data lebih cepat dari apa yang dapat menyediakan penyimpanan data, maka Anda mendapatkan iowait. Saat itulah kernel menghentikan proses selama pemblokiran io (pembacaan yang datang terlalu lambat atau sinkronisasi menulis).
Jadi, periksa apakah penyimpanan dapat menyediakan throughput yang cukup untuk 24 core.

Contoh, mari kita asumsikan penyimpanan Anda dapat memberikan throughput 500MB / s, bahwa Anda terhubung melalui 2 Gigabit Ethernet line (bond), jaringan sudah akan membatasi throughput maksimum hingga sekitar 100-180 MB / s. Jika proses Anda memakan data dengan kecepatan 50 MB / s dan Anda menjalankan 4 utas pada mesin 4 inti Anda: 4 x 50 MB / s = 200 MB / s dikonsumsi. Jika jaringan dapat mempertahankan 180MB / s maka Anda tidak akan memiliki banyak latensi dan CPU Anda akan dimuat. Jaringan di sini adalah hambatan kecil.
Sekarang jika Anda menskalakan hingga 24 core dan 24 thread, Anda akan membutuhkan 1.200 MB / s, bahkan jika Anda mengubah kabel untuk memungkinkan throughput seperti itu, sistem penyimpanan Anda tidak menyediakan lebih dari 500 MB / s, itu menjadi hambatan.

Ketika datang untuk menunggu, kemacetan bisa terjadi di mana-mana. Tidak hanya pada lapisan fisik, tetapi juga dalam perangkat lunak dan buffer ruang kernel. Itu benar-benar tergantung pada pola penggunaan. Tetapi karena hambatan perangkat lunak jauh lebih sulit untuk diidentifikasi, biasanya lebih disukai untuk memeriksa throughput teoretis pada perangkat keras sebelum menyelidiki tumpukan perangkat lunak.

Seperti yang dikatakan, iowait terjadi ketika suatu proses melakukan pembacaan dan data membutuhkan waktu untuk tiba, atau ketika membuat sinkronisasi menulis dan pengakuan modifikasi data membutuhkan waktu. Selama penulisan sinkronisasi, proses memasukkan sleep yang tidak terputus sehingga data tidak rusak. Ada satu alat yang berguna untuk melihat mana panggilan membuat proses menggantung: latencytop. Ini bukan satu-satunya dari jenisnya, tetapi Anda dapat mencobanya.

Catatan: untuk informasi Anda, dm berarti mapper perangkat, bukan penggerak data.

Huygens
sumber
1
Saya sepenuhnya setuju (dan merasa kurang dipahami dengan baik) bahwa menjaga sumber daya sistem / solusi seimbang adalah penting. Tetapi saya juga ingin menunjukkan bahwa IOWTapat juga dapat disebabkan oleh tingginya tingkat acak IO (baik itu satu proses melakukan banyak pencarian atau banyak proses menuntut data mereka dicari). Dalam hal ini IOWTait bisa menjadi tinggi tanpa IO bandwidth menjadi faktor masalah.
Matthew Ife
@MIfe Anda sepenuhnya benar tentang ini. Saya juga mulai menyebutkan aspek ini ketika saya menunjuk untuk memeriksa lapisan perangkat lunak. Jika pipa cukup besar antara penyimpanan perangkat keras dan proses perangkat keras, maka masalahnya terletak pada tumpukan perangkat lunak, mulai dari buffer TCP (misalnya dalam ruang kernel) hingga akses acak ke data secara bersamaan (misalnya di ruang pengguna). Dan ini jauh lebih sulit untuk diidentifikasi.
Huygens
5

Pertama-tama, neraka suci itu banyak zat besi! :)

Sayangnya karena pengaturan Anda terdengar sangat kompleks, saya tidak berpikir ada orang yang bisa langsung memberikan "Ini masalah Anda!" jawab, kecuali mereka telah melakukan sesuatu dengan setup yang sangat mirip atau identik dan mengalami masalah yang sama. Jadi, sementara teks ini diberi label oleh SU sebagai "Jawaban", Anda mungkin harus menganggapnya lebih seperti "Saran". Dan saya tidak dapat menuliskannya di komentar karena terlalu banyak kata. : S

Tanpa pengetahuan tentang bagaimana perangkat keras Anda dipetakan ke perangkat, sulit untuk mengatakan mengapa I / O terjadi di satu tempat dan bukan di tempat lain. Bagaimana Anda memasang perangkat? Apakah program Anda mengakses sd*perangkat secara langsung, atau semua sistem file Anda dipasang pada dmperangkat dan semua akses file terjadi di sana?

Hal-hal lain yang harus saya tanyakan:

  • RAID macam apa itu? Jika Anda menghitung bit paritas dengan RAID5 atau RAID6, mudah-mudahan dapat ditangani oleh perangkat keras server raid ... jika tidak, server pemrosesan melakukan hal itu .... yang tidak optimal dan dapat menyebabkan latensi I / O jika dilakukan dalam perangkat lunak.

  • Anda mengisolasi salah satu perbedaan utama antara dua server dalam pesan Anda. Salah satunya menggunakan saluran serat dan satu menggunakan ethernet. Fibre Channel harus menyediakan latensi dan bandwidth yang lebih baik, tapi mungkin itu juga masalah: jika itu menyediakan banyak throughput, itu bisa membuat server RAID sangat sibuk sendiri ... dan kemacetan menyebabkan buffer / cache mengisi, yang meningkatkan latensi, yang menyebabkan I / O menunggu lebih tinggi.

Ini hampir seolah-olah Anda mungkin memiliki masalah mengasapi buffer dengan array disk Anda - Anda tahu? Pengontrol RAID perangkat keras biasanya memiliki banyak cache on-board, bukan? Jadi ketika I / O ke media mengalami antrian dan cache penuh dengan halaman-halaman yang kotor, akhirnya semuanya menjadi jenuh (jika penyimpanan mekanis tidak dapat mengikuti beban) dan latensi berlayar melalui atap ... tentu saja Anda dapat menghasilkan lebih banyak beban dengan 24 core + FC daripada dengan 4 core + GbE :) Periksa server RAID dan lihat seberapa sibuk disk-disknya ... banyak "I / O" mungkin saja paket kontrol, dll. Saya Saya tidak yakin bagaimana FC bekerja tetapi jika itu seperti TCP maka Anda akan melihat pengiriman ulang jika latensi terlalu tinggi.

Seperti jika Anda mengajukan pertanyaan kepada seseorang melalui telepon dan mereka tidak menjawab selama beberapa detik, Anda mengatakan "Halo?" - protokol jaringan (dan FC hanyalah protokol jaringan) melakukan hal yang sama, hanya dalam skala waktu yang lebih pendek. Tapi tentu saja tambahan itu "Halo?" mahal dalam konteks jaringan karena bahkan menambah lebih banyak data ke pipa yang sudah macet.

Sebagai penutup, tip umum:

Ketika debugging latensi / IO menunggu / masalah throughput, selalu ukur . Ukur di mana-mana. Mengukur di kawat, mengukur apa yang sedang dilakukan oleh program itu sendiri, mengukur di ujung pemrosesan, mengukur pada server RAID, dll. Jangan hanya melihatnya dari satu perspektif - cobalah untuk mempertimbangkan setiap komponen individu dari sistem yang bertanggung jawab untuk memproses, membaca atau menulis data apa pun dalam pipa. Membongkar satu transaksi atau satu unit kerja yang terpisah dan membedah persis jalan yang diambil melalui perangkat keras Anda, dan mengukur pada setiap komponen yang berbeda untuk melihat apakah ada kemacetan atau tempat di mana ada latensi yang tidak semestinya, dll. Seorang teman saya menyebut ini "peeling kembali bawang ", dan saya telah menggunakan frase sejak itu untuk merujuk pada tugas debugging aliran data.

allquixotic
sumber
2

Tambahan kecil. Anda mungkin ingin melihat penyetelan level-blok dan penjadwal I / O Anda dalam kasus ini. Saya tidak begitu akrab dengan Ubuntu, tetapi ada sejumlah tombol kinerja penyimpanan yang perlu diubah. Ini jelas berlaku untuk penyimpanan SAN dan basis data.

  • Lihatlah penjadwal I / O sistem . CFQ adalah default, tetapi noop dan deadline adalah pilihan umum untuk beban kerja database.
  • Lihat tautan ini untuk beberapa parameter penyetelan lain yang mungkin membantu.
  • Anda menyebutkan NFS dan memblokir penyimpanan. Jika blok, sistem file mana yang digunakan? I / O menunggu terdengar seperti situasi pemblokiran tulis dari sini. Apakah hambatan penulisan diaktifkan? Remount sistem file Anda dengan nobarrier. ( Petunjuk untuk Ubuntu )

Beberapa tautan Server Fault yang relevan ...

Linux - penyetelan pengontrol RAID perangkat keras dunia nyata (scsi dan cciss)

putih
sumber
1

Terima kasih untuk semua ide dan masukannya. Masalahnya terkait dengan kombinasi konfigurasi ikatan ethernet yang tidak optimal, dikombinasikan dengan modul I / O yang rusak pada VNX itu sendiri. Tingkat I / O sekarang dekat dengan yang kami harapkan. Sangat menarik untuk dicatat bahwa tes menulis file dan membaca dd dan tolok ukur iozone tidak dapat mendeteksi ini, dan dapat membaca dan menulis hampir secepat yang diharapkan.

Benjamin
sumber
Apakah EMC memberikan dukungan / analisis untuk membantu Anda mencapai kesimpulan itu?
ewwhite
Iya. (lebih banyak karakter)
Benjamin
0

Saya akan mengedit dengan lebih banyak informasi segera, tetapi pertama-tama saya ingin mengatakan bahwa Anda tidak boleh membiarkan output iostat's dm- * membingungkan Anda. Device-mapper adalah perangkat passthru di-kernel seperti md * (md0, md1, dll.) Sehingga Anda benar-benar hanya peduli dengan perangkat yang mendasarinya. Semua data yang lewat ke disk Anda melewati dm / md di jalan, dan total sebenarnya (byte, detik, dll.) Akurat, tetapi penggunaannya menyesatkan.

Juga, itu adalah jumlah memori yang sangat besar. Hal-hal lucu mulai terjadi setinggi itu (saya sendiri menjalankan 2x64 dan 2x96), terutama jika Anda memiliki satu proses yang menghabiskan lebih dari setengah ram. Baca artikel ini untuk informasi lebih lanjut . Artikel itu menyebutkan mysql tetapi harap dicatat tidakspesifik mysql. Setiap proses perangkat lunak akan dikenakan penalti untuk mengakses memori prosesor fisik lain - pikir 48GB milik satu proc, 48 ke yang lain. Proses ini hanya dapat dimiliki oleh satu proc dan untuk mencapai memori procs lainnya (setelah 48GB sendiri telah habis), ia harus memutuskan untuk menyimpan sebagian dari 48 itu dalam swap atau membayar harga yang sangat besar untuk sampai ke & dari memori proc lainnya. Artikel itu menyarankan menjalankan perintah numactl untuk memaksa perangkat lunak untuk tidak bertukar dan membayar penalti. Saya pribadi melihat peningkatan besar-besaran dari ini. Dengan kata lain - periksa untuk melihat apakah beberapa I / O Anda akan bertukar! Gunakan free -m (atau serupa) untuk ini. Jika Anda memiliki banyak memori bebas, tetapi sejumlah swappage yang tidak sepele (katakanlah 10% plus), ini mungkin masalah Anda.

fimbulvetr
sumber
0

Melihat ini dari perspektif penyimpanan, apakah Anda memiliki cara untuk mengukur latensi scsi? Waktu tunggu OS io mencakup banyak hal di luar kendali penyimpanan, tetapi ketika saya masuk ke kotak penyimpanan dan melihat latensi IO pada 2ms, saya tahu bahwa terlepas dari apa yang server dapatkan secara internal, perintah scsi sedang ditanggapi cepat, dan saya bisa menghilangkan penyimpanan sebagai variabel.

Kemangi
sumber