Saat ini saya memiliki server Apache2 yang berjalan dengan mpm-prefork
dan mod_php
pada VPS OpenVZ dengan 512M real / 1024M burstable RAM (tanpa swap). Setelah menjalankan beberapa tes, saya menemukan bahwa ukuran proses maksimum yang didapat Apache adalah 23M, jadi saya telah menetapkan MaxClients
ke 25 (23M x 25 = 575 MB, ok untuk saya). Saya memutuskan untuk menjalankan beberapa tes beban di server saya, dan hasilnya membuat saya bingung.
Saya menggunakan ab
di mesin desktop saya meminta halaman utama dari blog wordpress.
Ketika saya menjalankan ab
dengan 24 koneksi bersamaan, semuanya tampak baik-baik saja. Tentu, CPU naik, RAM bebas turun, dan hasilnya sekitar 2-3s waktu respons per permintaan.
Tetapi jika saya menjalankan ab
dengan 25 koneksi bersamaan (batas server saya), Apache hanya hang setelah beberapa detik. Itu mulai memproses permintaan, kemudian berhenti merespons, CPU kembali ke idle 100% dan ab
waktu habis. Log Apache mengatakan sudah tercapai MaxClients
.
Ketika ini terjadi, Apache tetap terkunci dengan 25 proses yang berjalan (mereka semua dalam "W" jika saya memeriksa status server) dan hanya setelah TimeOut
pengaturan proses mulai mati dan server mulai merespons lagi (dalam kasus saya sudah diatur ke 45).
Pertanyaan saya: apakah itu perilaku yang diharapkan? Mengapa Apache mati begitu saja MaxClients
? Jika bekerja dengan 24 koneksi, bukankah seharusnya bekerja dengan 25, hanya mungkin mengambil lebih banyak waktu untuk menanggapi setiap permintaan dan mengantri sisanya?
Kedengarannya agak aneh bagi saya bahwa setiap anak yang berjalan ab
sendiri dapat membunuh server web hanya dengan mengatur koneksi bersamaan ke server MaxClients
.
sumber
Apa yang terjadi di sini adalah bahwa Anda memiliki 25 utas yang dapat menerima koneksi, dan Anda mengirim 26 permintaan bersamaan. Permintaan terakhir itu berada di antrian soket tergantung pada ukuran simpanan Anda.
Masalah kedua adalah apa pun yang Anda jalankan yang memakan waktu 2-3 detik, perlu waktu cukup lama untuk merespons bahwa 25 koneksi bersamaan memperlambatnya. sleep (1) mungkin bekerja, tetapi, sesuatu di mana Anda melakukan penguncian file atau penguncian tabel dari mysql, setiap permintaan paralel mungkin menunggu sebelum selesai sampai mereka mencapai batas waktu 45 detik.
23MB terdengar kecil untuk proses apache dengan mod_php dan modul apa pun dimuat, jadi, saya curiga Anda mungkin melihat proses apache mengambil ram sedikit lebih saat aplikasi Anda berjalan. Anda tidak dapat benar-benar melakukan matematika dengan MaxClients dan memori seperti itu ... itu akan menjadi agak dekat, tetapi, Anda tidak pernah tahu.
Ada satu mesin, proses 56M dan 49M.
mesin lain:
mesin lain:
Jadi, penggunaan memori sangat tergantung pada tugas, modul mana yang dimuat dll. Pada dua terakhir, saya yakin kami telah menonaktifkan pdo & pdo_mysql karena aplikasi itu tidak menggunakannya.
Pertanyaan sebenarnya adalah, apa yang Anda lakukan yang memakan waktu 3 detik? Di dunia saat ini, itu adalah keabadian dan dianggap sebagai aplikasi 'pemblokiran'. Apache biasanya tidak akan mati, tetapi, akan meninggalkan utas-utas itu dalam antrian backlog sampai dapat melayani mereka atau permintaan tunggu menunggu waktu habis. Saya percaya aplikasi Anda mungkin menyebabkan apache untuk time out. Cobalah di halaman yang berisi hanya phpinfo (); dan lihat apakah hasilnya sama.
sumber