Pengaturan saya: Saya memiliki 3 mesin server web yang hampir sama yang melayani situs web dinamis dengan muatan tinggi yang sama dengan penyeimbangan muatan sederhana di atas dns. Layanan ini telah bekerja selama lebih dari dua tahun dengan konfigurasi apache yang sama: apache2, php5, ubuntu 8.04 linux 2.6.24-29-server.
Masalah saya: Sejak sekitar dua minggu lalu saya mengalami masalah dengan konfigurasi ini. Hampir setiap hari saya memiliki satu momen kecil selama sekitar 5 menit, di mana situs web tidak dapat dijangkau. Saya masih bisa masuk ke server melalui ssh. Jika saya menjalankan htop
, saya melihat mesin tidak melakukan apa-apa. Saya memiliki sekitar 1000 proses apache yang berjalan, tetapi tidak ada aktivitas cpu.
Saya telah menggunakan apache mod_status untuk men-debug situasi ini. Papan skor proses terlihat seperti ini:
_C.___K_______________________R._______.__K_K____K___C_______.__
_______C__________.___________________________________.________C
_.____K__________K___K_WK_____._K_____________________________._
W______K__________K________.____________________._______C_______
_C_.__K__K____.._.._____________________________________C_______
_R___________K___.______C________.C_________.______._____C______
____________KKC____K_____K__WC_________________C_____.__.____.__
_____________________C_________K______.____C______._____________
_.___C____.___.___________________________.K______.____K________
W__.___________________C.__.____K________K_______R_._.__._______
__C__C_.__________C__C_______._____W______________C_.___C_______
____.______C_____________C________.____C____________.________._K
__.__________.K_____________K_________._____C____.K__________KW_
__K.W________R_________._______.___W___________.____.__K_____W__
W___.___..________W____K
Scoreboard Key:
"_" Waiting for Connection, "S" Starting up, "R" Reading Request,
"W" Sending Reply, "K" Keepalive (read), "D" DNS Lookup,
"C" Closing connection, "L" Logging, "G" Gracefully finishing,
"I" Idle cleanup of worker, "." Open slot with no current process
Jadi sebagian besar proses hanya menunggu koneksi. setelah sekitar 5 menit situasinya akan kembali normal: saya memiliki banyak proses pada setiap mesin, sebagian besar pekerja memiliki "." - status (meaing mereka terbuka untuk memproses permintaan) dan tentu saja situs web dapat dijangkau!
jadi saya mencoba untuk menemukan sesuatu di log, tetapi tidak ada apa-apa ... log akses apache diam selama sekitar 4 menit, hal yang sama adalah untuk log kesalahan. saya juga tidak dapat menemukan sesuatu yang salah di log sistem lain.
situasinya sama pada ketiga webservers (semuanya memiliki puncak beban dan kondisi tidak responsif pada saat yang sama), jadi saya tidak merasa ini terkait perangkat keras. tetapi saya pikir, ini mungkin terkait dengan beberapa masalah jaringan (tcp).
ada ide?
EDIT: beberapa informasi lebih lanjut, yang baru saja saya temukan:
Itu baru saja terjadi lagi dan saya dapat memverifikasi bahwa saya juga tidak dapat terhubung secara lokal ketika masalah ini terjadi.
Saya telah membuat beberapa statistik koneksi dengan perintah berikut setelah itu terjadi: netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c
- 109 CLOSE_WAIT
- 2652 DIDIRIKAN
- 2 FIN_WAIT1
- 11 LAST_ACK
- 12 DENGARKAN
- 91 SYN_RECV
- 1 SYN_SENT
- 16 TIME_WAIT
Jika saya menjalankan perintah yang sama beberapa waktu kemudian, saya memiliki sesuatu seperti ini:
- 4 PENUTUP
- 108 DIDIRIKAN
- 18 FIN_WAIT1
- 182 FIN_WAIT2
- 37 LAST_ACK
- 12 DENGARKAN
- 50 SYN_RECV
- 11276 TIME_WAIT
Jadi dalam situasi normal saya hanya memiliki 100-200 koneksi terbuka oleh klien yang ditangani oleh apache pada saat ini. Ketika saya mengalami "crash" ini, saya memiliki lebih banyak koneksi. Apa cara terbaik untuk menganalisis ini?
EDIT2: baris penting di apache2.conf adalah:
KeepAlive On
MaxKeepAliveRequests 20
KeepAliveTimeout 1
<IfModule mpm_prefork_module>
ServerLimit 920
StartServers 30
MinSpareServers 80
MaxSpareServers 120
MaxClients 920
MaxRequestsPerChild 700
</IfModule>
Ini adalah prefork apache2 dengan php_mod.
Server memiliki ram 8GB dan partisi swap 4gb.
tcpdump
) akan membantu Anda sampai ke akar masalahnya ... btw apa penggunaan memori Anda dan kebijakan firewall?Jawaban:
Anda harus mengaktifkan status mod_status yang diperluas ( http://httpd.apache.org/docs/2.2/mod/mod_status.html#extendedstatus ) untuk memantau host saat ini dan permintaan sedang diproses. Saya pikir ada skrip / halaman yang membutuhkan terlalu banyak waktu untuk melepaskan koneksi dan itu membuat koneksi menumpuk.
sumber
Pertama: Periksa
Max open files
batas Anda pada proses. Koneksi soket aktif dianggap sebagai file terbuka.cat /proc/###/limits
adalah cara yang baik untuk memeriksa nilai efektif untuk proses lain. Anda bisa mendapatkan daftar file terbuka denganlsof -p ###
tempat ### adalah id proses server web Anda. Anda dapat membandingkanlsof -p ### | wc -l
untuk melihat seberapa dekat Anda dengan batas. Anda juga harus melihat pesan di error_log apache jika Anda mencapai batasnya.Anda memerlukan pegangan file untuk setiap koneksi soket, dan juga untuk setiap skrip cgi atau referensi file data. Untuk 920 MaxClients, Anda harus mengkonfigurasi setidaknya 4.000 file untuk proses httpd. Anda dapat menambah jumlah file dengan menambahkan file di /etc/security/limits.d/ dengan konten berikut. Pastikan nama pengguna cocok dengan apa yang Anda gunakan untuk server web Anda.
Kedua: Jika kelelahan port adalah masalah Anda, Anda dapat menyesuaikan beberapa pengaturan ip di /etc/sysctl.conf. (Dimulai dengan
net.ipv4.tcp_fin_timeout
). Ini biasanya masalah hanya dengan banyak koneksi yang sangat kecil. Banyak soket TIME_WAIT adalah salah satu indikatornya, tetapi ini menunjukkan kelelahan port hanya jika disertai dengan kesalahan dalam syslog tentangpossible SYN flooding
danSending cookies
. Anda juga harus memastikan server Anda berada di belakang firewall yang dapat menggagalkan serangan SYN berbahaya.sumber
Juga, ingatlah bahwa dalam prefork MPM, setiap proses akan memiliki PHP dalam ruang memorinya (apa pengaturan batas memorinya?). Anda mungkin ingin mencoba mengubah ke MPM pekerja, yang mungkin memerlukan modul PHP yang sedikit berbeda.
Juga anting-anting jarak jauh yang berharga untuk memangkas konfigurasi Apache Anda dari modul-modul asing
Dalam pengalaman saya, hal-hal seperti itu dipicu oleh hal-hal seperti crawler mesin pencari, atau hal-hal seperti konflik ARP. Atau tingkat lalu lintas di beberapa bagian terkait jaringan.
Anda mungkin menemukan 'sar' berguna ... bukan yang paling ramah, tetapi tentu berguna.
Mungkin juga terkait. Sar dapat memberi tahu Anda (jika Anda mengonfigurasinya untuk merekam aktivitas disk), berapa rata-rata io waktu tunggu. Anda juga dapat melihat waktu Tunggu IO di atas (yang merupakan persentase, baca apa artinya sebenarnya). Ini bisa signifikan jika Anda menggunakan SAN atau lingkungan virtual.
sumber