Mengapa waktu respons meledak ketika frekuensi permintaan turun?

22

Koreksi : waktu respons ( %D) adalah μs bukan ms! 1

Ini tidak mengubah apa pun tentang keanehan pola ini, tetapi itu berarti bahwa cara ini praktis tidak terlalu merusak.


Mengapa waktu respons berkorelasi terbalik dengan frekuensi permintaan?

Bukankah seharusnya server merespons lebih cepat ketika kurang sibuk menangani permintaan?

Adakah saran bagaimana membuat Apache "mengambil keuntungan" dari beban yang lebih sedikit?

masukkan deskripsi gambar di sini

Pola ini periodik. Itu berarti akan muncul jika tayangan turun di bawah sekitar 200 permintaan per menit - yang terjadi (karena aktivitas pengguna alami) dari larut malam hingga dini hari.


Permintaan POST sangat sederhana mengirim JSON kurang dari 1000 karakter - JSON ini disimpan (ditambahkan ke file teks) - itu saja. Jawabannya hanya "-".

Data yang ditampilkan dalam grafik dicatat dengan Apache itu sendiri:

LogFormat "%{%Y-%m-%d+%H:%M:%S}t %k %D %I %O" performance
CustomLog "/var/log/apache2/performance.log" performance
Raffael
sumber
2
Apakah mungkin ada sesuatu yang menyebabkan tekanan cache, dan akibatnya ia harus mengambil sesuatu dari disk? Seperti apakah aktivitas disk itu?
TLW
2
Apakah permintaan ini tiba per menit atau permintaan ditangani per menit?
user253751
Perangkat lunak apa yang Anda gunakan untuk merekam dan memplot data ini? Genuinely curious
Délisson Junio
1
@wingleader: direkam dengan Apache2 dan diplot dengan R
Raffael
@immibis: lihat konfigurasi log yang saya tambahkan - saya pikir ini "kedatangan"
Raffael

Jawaban:

31

Ini adalah perilaku umum di pusat data. Waktu respons Anda lambat sesuai dengan apa yang biasa disebut Jendela Batch. Ini adalah periode waktu ketika aktivitas pengguna diharapkan rendah dan proses batch dapat dijalankan. Pencadangan juga dilakukan selama periode ini. Aktivitas ini dapat menyaring sumber daya server dan jaringan yang menyebabkan masalah kinerja seperti yang Anda lihat.

Ada beberapa sumber yang dapat menyebabkan masalah:

  • Beban CPU tinggi. Ini dapat menyebabkan apache menunggu irisan waktu untuk memproses permintaan.
  • Penggunaan memori tinggi. Ini dapat membersihkan buffer yang memungkinkan apache melayani sumber daya tanpa membacanya dari disk. Ini juga dapat menyebabkan paging / swapping pekerja apache.
  • Aktivitas disk tinggi. Ini dapat menyebabkan aktivitas I / O disk menjadi antri dengan penundaan terkait dalam menyajikan konten.
  • Aktivitas jaringan tinggi. Ini dapat menyebabkan paket-paket harus antri untuk transmisi, meningkatkan coba lagi dan menurunkan layanan.

Saya gunakan saruntuk menyelidiki dikeluarkan seperti ini. atsardapat digunakan mengumpulkan sardata menjadi file data harian. Ini dapat diperiksa untuk melihat seperti apa perilaku sistem pada siang hari ketika kinerja normal, dan overnite ketika kinerja variabel.

Jika Anda memantau sistem dengan muninatau sistem lain yang mengumpulkan dan membuat grafik pemanfaatan sumber daya, Anda dapat menemukan beberapa indikator di sana. Saya masih menemukan yang sarlebih tepat.

Ada alat seperti nicedan ioniceyang dapat diterapkan pada proses batch untuk meminimalkan dampaknya. Mereka hanya efektif untuk masalah CPU atau I / O. Mereka tidak mungkin menyelesaikan masalah dengan Memori atau aktivitas Jaringan.

Memindahkan aktivitas cadangan ke jaringan terpisah dan mengurangi pertikaian jaringan. Beberapa perangkat lunak cadangan dapat dikonfigurasi untuk membatasi bandwidth yang akan digunakan. Ini bisa menyelesaikan pertengkaran jaringan.

Bergantung pada bagaimana proses batch dipicu, Anda mungkin dapat membatasi jumlah proses batch yang berjalan secara paralel. Ini sebenarnya dapat meningkatkan kinerja proses batch karena mereka kemungkinan mengalami pertentangan sumber daya yang sama.

BillThor
sumber
1
Tautan ke sarmungkin bermanfaat. Saya menemukan ini: en.wikipedia.org/wiki/Sar_(Unix)
Roger Lipscombe
ini mungkin bukan hanya cadangan, penyedia vm dapat memindahkan lebih banyak vm ke mesin yang sama di waktu henti dan mematikan beberapa rak untuk menghemat energi (atau memang, mendedikasikan mereka untuk tugas-tugas batch)
Jens Timmerman
8

Hubungan ini dapat terjadi ke arah lain jika pengirim permintaan menunggu permintaan sebelumnya untuk menyelesaikan sebelum mengirimkan yang baru. Dalam hal itu, lalu lintas turun seiring bertambahnya waktu permintaan (untuk alasan apa pun), karena antrian sisi klien.

Atau itu bisa menjadi artefak pengukuran Anda - jika grafik di atas menunjukkan permintaan yang telah selesai , yang bertentangan dengan permintaan yang tiba , kurs akan turun ketika waktu pemrosesan permintaan bertambah (dengan asumsi kapasitas terbatas: D).

Karol Nowak
sumber
Tentu saja ini hanya menggaruk permukaan alasan yang mungkin, tetapi pernyataan masalah pembukaan tidak banyak memberi perhatian. Apakah proses ini berbicara dengan hal lain? Jenis permintaan apa yang dilayaninya? Apakah beban kerja berubah seiring waktu? Dan seterusnya ....
Karol Nowak
perspektif yang menarik tetapi tidak berjalan dengan baik dengan periodisitas dan lamanya gejala
Raffael
7

Meskipun jawaban @ BillThor mungkin benar, tampaknya tidak mungkin bahwa periode beban rendah sepenuhnya diambil oleh proses cadangan (yaitu bahwa periode tersebut cocok dengan tepat).

Penjelasan alternatif hanyalah caching. Jika skrip / database / apa pun yang diberikan belum digunakan baru-baru ini, data cache yang relevan mungkin telah dibuang untuk mengosongkan memori untuk sisa sistem operasi. Ini mungkin indeks pada database, atau buffer O / S dalam kaitannya dengan file, atau yang serupa lainnya. Permintaan kemudian harus menyusun kembali informasi ini jika sudah lama sejak permintaan terakhir. Dalam periode sibuk ini tidak akan terjadi karena kueri terakhir akan sering. Ini juga akan menjelaskan mengapa Anda melihat waktu respons rendah dan waktu respons tinggi selama periode sibuk.

abligh
sumber
Terutama jika caching permintaan, dan / atau caching akses disk terlibat. Sebagai tambahan jika ada strategi "menggunakan kembali" strategi yang membantu juga.
mckenzm
Tidak ada bacaan apa pun yang terlibat.
Raffael
1
@ Rafael Saya sangat meragukan Anda dapat menjamin "tidak ada pembacaan dalam bentuk apa pun". Pada tingkat yang sepele, anggaplah halaman-halaman Apache habis karena sesuatu yang lain menginginkan RAM? Misalkan MPM Anda untuk Apache telah mengurangi jumlah utas / proses sementara hal-hal menganggur dan ada overhead dalam membuat yang baru? Apakah Anda serius mengatakan bahwa jika Anda menjalankan straceproses Apache, Anda tidak melihat read()panggilan sistem atau yang serupa? Itu akan sangat tidak biasa.
Abligh
@abligh: baik, benar, "layanan" saya tidak secara eksplisit mengimplementasikan pembacaan apa pun dari disk
Raffael
@Raffael jika Anda ingin menguji efek caching OS (hanya), maka selama periode sibuk lakukan echo 3 > /proc/sys/vm/drop_cachessetiap 5 detik selama satu menit dan lihat apakah Anda mendapatkan efek yang sama pada waktu respons.
Abligh
2

Apa yang Anda lihat di sana terlihat, bagi saya, seperti itu bisa menjadi masalah statistik. Mungkin tidak, jawaban BillThor mungkin benar, tetapi saya akan memposting ini untuk kelengkapan.

Grafik waktu respons didasarkan pada persentil. Kelompok sampel 800-1000 permintaan adalah jumlah sampel yang baik untuk ini, kelompok 50-100 permintaan mungkin tidak begitu banyak.

Jika Anda menganggap bahwa jumlah permintaan lambat bukan fungsi linier dari volume permintaan, sehingga urutan kenaikan permintaan tidak menghasilkan urutan peningkatan permintaan lambat, maka volume permintaan yang lebih tinggi akan menghasilkan waktu permintaan rata-rata yang lebih rendah.

Kaithar
sumber
1
jika pengamatan hanya terdiri dari 50 hingga 100 permintaan, maka memang ini bisa hanya keacakan, tetapi jika Anda melihat grafik Anda akan melihat bahwa kita berbicara tentang 60 x 5 percobaan yang masing-masing melibatkan sekitar 50 hingga 100 permintaan - yang pasti cukup untuk mengesampingkan keacakan. Juga jika Anda melihat dekat Anda akan melihat rata-rata stabil persentil ke-50 muncul di sekitar 2500ms.
Raffael
Belum tentu, itu tidak cukup bagaimana statistik semacam ini berperilaku dalam jumlah besar. Misalnya, 1000 permintaan lebih dari 1 jam dan 1000 permintaan lebih dari 1 menit tidak akan berlaku sama. Mungkin juga tidak terjadi di sini. Ukuran sampel kecil berperilaku aneh, dalam hal ini lebih seperti set sampel 60x5. Pola ini bisa merupakan hasil dari pembebanan non-linear.
Kaithar
0

Ada kebohongan, kebohongan besar, dan statistik.

Hipotesis saya: Anda memiliki tiga kategori permintaan yang berbeda:

  1. Aliran variabel normal yang berisi sebagian besar permintaan dan ini semua diselesaikan dalam 200-300 μs.
  2. Aliran kecil dengan laju konstan sekitar 20 permintaan per menit (bahkan di malam hari). Masing-masing membutuhkan sekitar 2,500 μs untuk diselesaikan.
  3. Aliran kecil dengan laju konstan sekitar 10 permintaan per menit (bahkan di malam hari). Masing-masing memakan waktu di atas 4.000 μs.

Pada malam hari, 50 permintaan per menit juga 20 + 20 + 10. Jadi, hasil 50% persentil sekarang sangat bergantung pada hasil stream 2. Dan 95% persentil bergantung pada stream 3 sehingga bahkan tidak pernah dapat ditampilkan pada grafik.

Pada siang hari, aliran 2 + 3 tersembunyi dengan baik di atas persentil 95%.

kubanczyk
sumber
Apa maksud Anda dengan streaming? Permintaan benar-benar homogen sedangkan permintaan klien sangat heterogen.
Raffael
0

Semakin saya melihatnya, semakin saya cenderung berpikir bahwa ada masalah dengan pengumpulan data.

Pertama, ada sesuatu yang sangat aneh terjadi dengan TPS Anda. Sementara pola keseluruhan terlihat normal, ada jeda yang sangat tajam terjadi sekitar jam 9 malam, dan sekali lagi sekitar jam 7 pagi. Grafik normal akan jauh lebih mulus selama transisi ke jam-jam tidak sibuk.

Itu menunjukkan bahwa ada perubahan dalam profil, dan Anda mungkin memiliki 2 jenis klien yang berbeda:

  1. Satu yang beroperasi hanya antara 7 pagi (ish) dan 9 malam (ish), pada volume tinggi, dan
  2. lain yang mungkin beroperasi sepanjang waktu, pada volume yang lebih rendah.

Petunjuk kedua adalah sekitar pukul 18:00. Sebagian besar waktu sebelum dan sesudah, kita memiliki tinggi profil Volume - TPS tinggi dan latency rendah. Tetapi sekitar pukul 18:00 ada penurunan tiba-tiba dari 800-1000 RPM menjadi kurang dari 400 RPM. Apa yang mungkin menyebabkan itu?

Petunjuk ketiga adalah langkah-turun dalam waktu respons persentil ke-5. Saya sebenarnya lebih suka melihat waktu respons minimum (tetapi persentil ke-5 mungkin lebih baik) karena dua alasan: Ini memberi tahu saya waktu layanan (yaitu waktu respons dikurangi antrian), dan waktu respons cenderung mengikuti distribusi Weibull yang berarti mode (atau nilai paling umum) tepat di atas minimum.

Jadi langkah-turun dalam persentil ke-5 mengatakan kepada saya bahwa ada jeda seri yang tiba-tiba, dan waktu layanan telah benar-benar turun meskipun variasi dan waktu respons rata-rata telah sangat meningkat.

Langkah selanjutnya

Pada tahap ini saya akan melakukan penyelaman yang dalam ke log untuk mencari tahu apa yang berbeda tentang sampel volume rendah pukul 18:00 dibandingkan dengan sampel volume tinggi sebelum dan sesudahnya.

Saya akan mencari:

  • perbedaan dalam lokasi geografis (jika latensi memengaruhi $ request_time)
  • perbedaan dalam URL (seharusnya tidak ada)
  • perbedaan dalam metode HTTP (POST / GET) (seharusnya tidak ada)
  • permintaan berulang dari IP yang sama
  • dan perbedaan lainnya ...

BTW, "acara" pukul 18:00 adalah bukti yang cukup bagi saya bahwa tidak ada hubungannya dengan kemacetan / aktivitas pusat data. Untuk itu benar, kemacetan harus menyebabkan penurunan TPS, yang mungkin terjadi pada pukul 18:00 tetapi sangat tidak mungkin menyebabkan penurunan TPS yang berkelanjutan dan melengkung dengan lancar selama 10 jam antara jam 9 malam dan 7 pagi.

Nathan Webb
sumber