MaxClients dalam apache. Bagaimana cara mengetahui ukuran proses saya?

9

Dari http://httpd.apache.org/docs/2.2/misc/perf-tuning.html

Masalah perangkat keras terbesar yang mempengaruhi kinerja server web adalah RAM. Server web tidak boleh pernah bertukar, karena bertukar meningkatkan latensi setiap permintaan di luar titik yang dianggap pengguna "cukup cepat". Ini menyebabkan pengguna menekan berhenti dan memuat ulang, semakin menambah beban. Anda dapat, dan harus, mengontrol pengaturan MaxClients sehingga server Anda tidak menelurkan begitu banyak anak yang mulai bertukar. Prosedur untuk melakukan ini sederhana: tentukan ukuran rata-rata proses Apache Anda, dengan melihat daftar proses Anda melalui alat seperti atas, dan bagilah ini menjadi total memori yang tersedia, sisakan ruang untuk proses lain.

Masalah utama adalah bahwa saya tidak dapat memahami bagaimana mengetahui ukurannya, karena, saya memiliki ukuran httpd tidak lebih dari 3888.

Tapi, jika kita perlu menentukan angka untuk MaxClients, dan saya memiliki 4GB RAM, jadi saya mendapatkan: 972, jadi saya harus menggunakan seperti 900 di MaxClients?

Larry
sumber
4
"Saya memiliki ukuran httpd tidak lebih dari 3888" - Saya pikir saya berbicara untuk semua orang ketika saya berkata, "HUH?"
womble

Jawaban:

9

Pertama, tentukan PID dari salah satu proses Apache Anda.

Maka Anda dapat melakukan sesuatu seperti ini:

cat /proc/PIDHERE/status | grep VmRSS

Ini akan menghasilkan ukuran resident-set-saat (saat ini) dari proses tertentu, mirip dengan:

VmRSS: 304456 kB

Nilai ini seperti kedengarannya, itu adalah ukuran dari proses penduduk di RAM.

Kemudian normalisasikan satuan ukuran Anda ( 4GB * 1024 * 1024 = 4,194,304 KB). Membagi:

4194304 KB / 304456 KB = 13.77 processes

Pertimbangkan bahwa Anda mungkin memiliki proses lain yang berjalan pada sistem Anda yang akan mengkonsumsi memori juga, dan idealnya Anda ingin meminimalkan pertukaran, karena itu Anda tidak akan ingin 13 Apache MaxClients dikonfigurasi (menggunakan nomor saya), Anda ingin jumlah yang lebih sedikit (sesuai kebijakan Anda) ).

Ini adalah perkiraan kasar; ukuran proses Apache Anda dapat tumbuh seiring waktu tergantung pada beban.

loopforever
sumber
1
Meskipun RSS tidak termasuk halaman bersama, itu termasuk halaman yang ditandai sebagai copy-on-write - yaitu ada ruang pada mesin untuk proses lebih banyak daripada (jumlah rss) / (memori fisik). Lihat juga jawaban saya di tempat lain - ruang kosong sangat penting untuk kinerja yang baik.
symcbean
4

Memprediksi maxClients dari skenario pengujian adalah titik awal - tetapi untuk menyelesaikan masalah dengan benar, Anda perlu mulai mengukur bagaimana aplikasi Anda berperilaku dengan lalu lintas nyata.

Dengan asumsi apache Anda menjalankan pre-fork ....

Atur tugas cron untuk menghitung jumlah proses httpd dan output 'gratis'. Perhatikan bahwa jika server web Anda menyajikan konten apa pun dari file lokal (dan dalam banyak kasus, bahkan ketika tidak) jumlah memori yang tersedia untuk cache / buffer akan memiliki dampak besar pada kinerja. yaitu jika Anda sampai pada titik swapping, kinerja web Anda mungkin mengerikan!

Setelah Anda mendapatkan beberapa data, plot pada grafik dan lakukan regresi kuadrat terkecil di atasnya - memperkirakan untuk menemukan jumlah klien di mana Anda mencapai batas target Anda untuk penggunaan memori httpd. Titik awal untuk target memori akan menjadi lebih kecil dari 80% dari memori fisik / 80% dari ukuran konten.

(perhatikan jika MinSpareServers Anda disetel ke nilai yang sangat tinggi, hasilnya mungkin tidak akurat)

#!/bin/bash

LOGFILE='/var/log/httpd/memusage'
PIDS = `ps -ef | grep httpd | grep -v grep | wc -l`
MEM = `free | grep 'buffers/cache'`
DAY = `date '%Y-%m-%d %H:%M:%S'`
echo ${DAY} ${PIDS} ${MEM} >>LOGFILE

Di dunia yang ideal, Anda juga akan mengukur waktu respons URL dalam file log yang sama - tetapi itu menjadi jauh lebih kompleks.

symcbean
sumber
Bagi saya, buffer / cache sangat sedikit berubah baik menjalankan 11 klien atau ketika server telah mencapai 86 atau 151 klien (dan server macet). Apa yang Anda harapkan untuk dilihat dalam variabel MEM Anda? Saya mendapatkan dua angka, jadi bertanya-tanya apakah Ubuntu 12,04 memberikan sesuatu selain yang Anda harapkan.
PeterB
Coba jalankan 'gratis' dan Anda akan melihat apa yang saya harapkan (2 angka). Jika benar bahwa ada sedikit variasi dalam angka-angka ini dengan jumlah proses yang berbeda maka Anda menjalankan server berbasis acara atau pengaturan maxspareservers Anda konyol. Jika Anda memposting contoh output dan bagian-bagian relevan dari httpd.conf Anda, maka mungkin kita akan memiliki gambaran yang lebih baik?
symcbean
.... dan "crash"? Crash apa?
symcbean
Maaf, lihat pastebin.com/aHZCagVn untuk pengaturan httpd.conf dan contoh sampel. Maksud saya 'crash' adalah terlalu banyak klien, server kehabisan memori dan terkunci. Silakan lihat pastebin.com/fnXzBfQL untuk informasi lebih lanjut.
PeterB
1
@PeterB, sepertinya MySQLd yang menyebabkan masalah ini. Ketika pembunuh OOM kernel menendang para pelaku terburuk pertama-tama berdasarkan pada nilai / proc / PID / oom_score_adj. Sebagaimana dibuktikan dalam output Anda, mysqld pergi dulu. Anda mungkin perlu menyesuaikan pengaturan di my.cnf lebih tepat agar sesuai dengan batasan VM Anda. Sebagai / sementara / solusi, hanya untuk melihat apakah Anda dapat menghindari menendang pembunuh OOM, coba tambahkan swapfile untuk memori virtual tambahan; kemudian singkirkan begitu Anda telah mengidentifikasi masalah Anda yang sebenarnya.
loopforever