1GB VPS - Apache Worker MPM - FCGID - Koneksi konkurensi maksimum - RAM CAP

9

Saya telah menghabiskan satu atau dua minggu meneliti dan mengatur server saya untuk menjalankan Apache dengan MPM Pekerja dan FCID. Saya mencoba mengoptimalkannya untuk memungkinkan koneksi serentak mungkin. Sudah menjadi mimpi buruk untuk menemukan info bagus tentang MPM Pekerja.

Server - VPS dengan 1GB RAM (Dengan Apache dimatikan hanya menggunakan sekitar 150MB RAM) Saya ingin Apache memiliki CAP penggunaan memori sekitar 750MB - sehingga server saya tidak akan pernah kehabisan RAM.

Saya telah menjalankan server selama sekitar 2 tahun tanpa masalah - tetapi kami baru-baru ini mulai mengalirkan MP3 dan ini membutuhkan koneksi yang lebih bersamaan. Server juga memiliki beberapa serangan DDOS kecil - jadi saya memangkas pengaturan satu ton untuk mencegah server kehabisan memori - Saya juga menambahkan beberapa aturan firewall untuk membatasi tingkat.

Pengaturan yang saya miliki sekarang sepertinya berfungsi dengan baik - tetapi saya mendapatkan beberapa kesalahan kesalahan Segmentasi

[Sat Mar 23 03:19:50 2013] [notice] child pid 28351 exit signal Segmentation fault (11)
[Sat Mar 23 03:56:20 2013] [notice] child pid 29740 exit signal Segmentation fault (11)
*** glibc detected *** /usr/sbin/httpd.worker: malloc(): memory corruption: 0xb83abdd8 ***

Dan beberapa Kesalahan Memori

Out of memory during array extend.

Ini adalah pengaturan saya saat ini, saya akan sangat menghargai beberapa saran.

Pengaturan Apache:

Timeout 30
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 2
#####################
# Spawn 2 child processes, spawning 25 threads for each child process.
# So, a pool of 50 threads is left up and sleeping, ready to serve incoming requests.
# If more requests will come in, apache will spawn new child processes, each one spawning 25 threads,
# enlarging the thread pool until the total number of threads become 50. In that case, apache begin
# to cleanly drop processes, trying to reach 25 threads.
# New processes and its threads are spawned in case of a large spike of requests, until 200 parallel
# client requests are reached, then apache will no longer accept new incoming connections.
# When the load calm down, and requests come back under 200 parallel connections, apache will continue
# to accept connections. After 25, 000 requests served by a child, q. 1000 per thread, the process
# get closed by the father to ensure no memory leak is fired.
<IfModule worker.c>
ServerLimit      16
StartServers         2
MaxClients       400
MinSpareThreads   25
MaxSpareThreads  50 
ThreadsPerChild    25
MaxRequestsPerChild  1000
ThreadLimit          64 
ThreadStackSize      1048576
</IfModule>
#####################

Dan kemudian beberapa pengaturan di fcgid.conf

FcgidMinProcessesPerClass 0 
FcgidMaxProcessesPerClass 8 
FcgidMaxProcesses  25
FcgidIdleTimeout 60 
FcgidProcessLifeTime 120 
FcgidIdleScanInterval 30

Seperti yang diminta, output saya untuk /etc/my.cnf

[mysqld]
datadir = / var / lib / mysql
socket = / var / lib / mysql / mysql.sock
user = mysql

# skip-innodb

connect_timeout = 10
max_connections = 300
symbolic-links = 0
innodb_file_per_table = 1
myisam_sort_buffer_size = 8M
read_rnd_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256 ribu
sort_buffer_size = 512K
table_cache = 32
max_allowed_packet = 1M
key_buffer = 16k
query_cache_type = 1
query-cache-size = 32M
thread_cache_size = 16
net_buffer_length = 2K
thread_stack = 256 ribu
wait_timeout = 300

slow_query_log

# log-slow-queries = / var / log / mysql / slow-queries.log
slow_query_log = / var / log / mysql / slow-queries.log
long_query_time = 1

[mysqld_safe]
log-error = / var / log / mysqld.log
pid-file = / var / run / mysqld / mysqld.pid

Dan PHP memory_limit = 64M

pengguna1287874
sumber
Ada ide?
user1287874
1
jadi, dari 1 GB yang Anda miliki, jika Apache membutuhkan 750 MB, bagaimana Anda membayangkan 250 lainnya didistribusikan? Ini sangat penting ... Saya bertanya karena 750 adalah harapan yang sangat tidak realistis dan tidak sehat. Dari 1 GB ini secara realistis jika Anda ingin sistem berkinerja baik ~ 200 - 250 MB mungkin merupakan nilai tertinggi
Hrvoje Špoljar

Jawaban:

0

Pengaturan ini adalah semua tentang keseimbangan, seberapa tinggi Anda bisa mendapatkannya tanpa risiko kehabisan memori dan menabrak server, atau proses Anda terbunuh oleh orangtua vps, yang mungkin itu sebabnya Anda mendapatkan SegFaults.

Biasanya ketika saya mengoptimalkan server saya akan menjalankan skrip mysql tuning-primer.sh untuk mendapatkan gambaran berapa banyak memori pada maksimum MySQL yang dapat digunakan:

https://launchpad.net/mysql-tuning-primer

Kemudian untuk prefork saya akan mengalikan MaxClients dengan php memory_limit untuk mendapatkan gambaran tentang berapa banyak memori yang dapat digunakan oleh Apache + PHP secara maksimal. Ini adalah perkiraan kasar, tetapi begitu Anda sering melakukan ini, Anda bisa merasakannya.

Saya mencoba untuk menjaga total 2 itu di sekitar memori maksimum server, jika VPS Anda tidak memiliki partisi swap, saya pasti akan mencoba untuk membuatnya lebih rendah daripada maks ram untuk beberapa alasan:

1) Proses lain di server akan menggunakan memori

2) Beberapa skrip php di server mungkin menggunakan ini_set untuk mengubah memory_limit sendiri.

Jika Anda dapat memberikan /etc/my.cnf dan php memory_limit saya mungkin bisa membuat beberapa pengaturan yang baik untuk Anda.


sunting: Saya hanya ingin menyebutkan bahwa saya tahu Anda menggunakan pekerja dan bukan prefork, konsep yang sama berlaku tetapi pekerja harus berurusan dengan utas dan bukan hanya MaxClients sehingga prefork adalah contoh yang lebih baik. Saya harus melihat ke pengaturan setelah mendapatkan informasi yang diminta untuk memberi Anda nasihat yang baik

Michael Wineland
sumber
Halo Michael, saya telah memperbarui pengaturan saya (setelah mendapatkan beberapa saran dari orang-orang) Saya telah memindahkan Serverlimit ke 8 Maxclients ke 200 dan FCGID ke 10 - akan mengawasi dan melihat bagaimana kelanjutannya. Saya akan memposting output dalam posting asli segera
user1287874
seberapa cepat? April?
Eddie