VPS 1GB - MPM công nhân Apache - FCGID - Kết nối đồng thời tối đa - RAM CAP


9

Tôi đã dành một hoặc hai tuần để nghiên cứu và thiết lập máy chủ của mình để chạy Apache với MPM và FCID của Công nhân. Tôi đang cố gắng tối ưu hóa nó để cho phép các kết nối đồng thời nhất có thể. Thật là một cơn ác mộng khi tìm thấy thông tin tốt về MPM của Công nhân.

Máy chủ - VPS có RAM 1GB (Với Apache chỉ sử dụng khoảng 150 MB RAM) Tôi muốn Apache có mức sử dụng bộ nhớ khoảng 750 MB - để máy chủ của tôi sẽ không bao giờ hết RAM.

Tôi đã chạy máy chủ được khoảng 2 năm mà không gặp vấn đề gì - nhưng gần đây chúng tôi đã bắt đầu truyền phát MP3 và điều này đòi hỏi nhiều kết nối đồng thời hơn. Máy chủ cũng đã có một vài cuộc tấn công DDOS nhỏ - vì vậy tôi đã cắt giảm các cài đặt xuống một tấn để ngăn máy chủ hết bộ nhớ - Tôi cũng đã thêm một số quy tắc tường lửa để giới hạn tốc độ.

Thiết lập bây giờ tôi có vẻ như nó hoạt động tốt - nhưng tôi đang gặp một số lỗi Phân đoạn

[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 ***

Và một số lỗi hết bộ nhớ

Out of memory during array extend.

Đây là thiết lập hiện tại của tôi, tôi thực sự sẽ đánh giá cao một số lời khuyên.

Cài đặt 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>
#####################

Và sau đó một số cài đặt trong fcgid.conf

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

Theo yêu cầu đầu ra của tôi cho /etc/my.cnf

[mysqld]
datadir = / var / lib / mysql
ổ cắm = / var / lib / mysql / mysql.sock
người dùng = mysql

# bỏ qua

kết nối_timeout = 10
max_connections = 300
liên kết tượng trưng = 0
innodb_file_per_table = 1
myisam_sort_buffer_size = 8M
read_rnd_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
sort_buffer_size = 512K
bảng_cache = 32
max_allowed_packet = 1M
key_buffer = 16k
truy vấn_cache_type = 1
truy vấn-cache-size = 32M
thread_cache_size = 16
net_buffer_length = 2K
thread_stack = 256K
chờ_timeout = 300

chậm_query_log

# log-Slow-query = / var / log / mysql / Slow-query.log
Slow_query_log = / var / log / mysql / Slow-query.log
long_query_time = 1

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

Và bộ nhớ PHP_limit = 64M


Có ai có ý kiến ​​gì không?
dùng1287874

1
vì vậy, trong số 1 GB bạn có, nếu Apache mất 750 MB, làm thế nào để bạn hình dung 250 khác được phân phối? Điều này thực sự quan trọng ... Tôi đang hỏi bởi vì 750 là kỳ vọng rất phi thực tế và không lành mạnh. Trong thực tế, 1 GB này nếu bạn muốn hệ thống hoạt động tốt ~ 200 - 250 MB có lẽ là giá trị trần
Hrvoje poljar

Câu trả lời:


0

Các cài đặt này hoàn toàn cân bằng, bạn có thể nhận được chúng ở mức độ cao như thế nào mà không gặp phải tình trạng hết bộ nhớ và làm sập máy chủ hoặc khiến các quy trình của bạn bị cha mẹ vps giết chết, đó có thể là lý do khiến bạn gặp phải SegFaults.

Thông thường khi tôi tối ưu hóa máy chủ, tôi sẽ chạy tập lệnh mysql Tune-primer.sh để có ý tưởng về mức độ tối đa của bộ nhớ mà MySQL có thể sử dụng:

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

Sau đó, đối với prefork, tôi sẽ nhân MaxCl Client với php memory_limit để có ý tưởng về việc bộ nhớ Apache + PHP có thể sử dụng tối đa bao nhiêu. Đây là những ước tính sơ bộ nhưng một khi bạn đã làm điều này rất nhiều, bạn cảm thấy như vậy.

Tôi cố gắng giữ tổng số 2 cái đó xung quanh bộ nhớ tối đa của máy chủ, nếu VPS của bạn không có phân vùng trao đổi, tôi chắc chắn sẽ cố gắng giữ nó ở mức thấp hơn sau đó max ram vì một vài lý do:

1) Các tiến trình khác trên máy chủ sẽ sử dụng bộ nhớ

2) Một số tập lệnh php trên máy chủ có thể đang sử dụng ini_set để tự thay đổi memory_limit.

Nếu bạn có thể cung cấp /etc/my.cnf và php memory_limit, tôi có thể đưa ra một số cài đặt tốt cho bạn.


chỉnh sửa: Tôi chỉ muốn đề cập đến Tôi biết bạn đang sử dụng worker chứ không phải prefork, các khái niệm tương tự được áp dụng nhưng worker phải xử lý các luồng và không chỉ MaxCl Client nên prefork là một ví dụ tốt hơn. Tôi sẽ phải xem xét các cài đặt sau khi nhận được thông tin được yêu cầu để cho bạn lời khuyên tốt


Xin chào Michael, tôi đã cập nhật cài đặt của mình (sau khi nhận được một số lời khuyên từ mọi người) Tôi đã chuyển Serverlimit xuống 8 Maxclents xuống còn 200 và FCGID xuống 10 - sẽ theo dõi và xem nó hoạt động như thế nào. Tôi sẽ sớm đăng các kết quả đầu ra trong bài viết gốc
user1287874

thế nào tháng tư?
Eddie
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.