Httpd

在 512mb VPS 上在 Varnish 後面配置 HTTPD

  • July 8, 2011

我在具有 512mb 記憶體的專用 VPS 上為客戶託管一個網站。在過去的 2 週內,由於 0% 的可用記憶體(或空閒交換),它已經用完兩次。該站點是數據庫密集型的,因為它執行帶有 60 多個模組的 Drupal。平均而言(根據網站所有者的說法),每月約有 6,000 名訪問者(約 200 名/天)。不過,它可能會增長得相當快——它剛剛推出不到一年。

所以我坐下來終於掌握了對 Apache 的理解。我以前手動配置過 httpd.conf,但沒有完全理解所有的複雜性。

我知道我應該通過 MaxClients 計算我的平均 Apache 程序大小(以 Mb 為單位),並且這個數字不應該超過系統可用的記憶體。根據 Top 的說法,每個程序大小略低於 7%(這將是大約 1.4Mb,對嗎?)。512/1.5 = 341…這對我來說似乎非常大。我是不是誤會了什麼?起初,我認為我應該按百分比計算程序大小(在本例中為 ~7)。也許我第一次是對的?

這為其他作業系統程序提供了一點空間。

數據庫(MySQL)位於同一主機上。

我的問題是雙重的。1)我正在考慮安裝 Varnish 以幫助減少數據庫負載(幾乎所有訪問者都未經身份驗證),以加快初始響應時間等…對於記憶體量這麼少的系統,我瘋了嗎?如果我這樣做,我正在考慮給它 256Mb。想法?顯然,事情不會在記憶體中停留很長時間。256/7 = ~36 頁。然而,我希望“主要”頁面會被記憶體。首頁,以及首頁後面的一些主要頁面,將是相當密集的數據庫,我想盡可能減少磁碟 IO 的數量。

  1. 如果我確實安裝了 Varnish,我想知道是否應該將 Apache 設置調整為目前的一半,因為我已經給 Varnish 一半的記憶體。在這個低級配置中,Varnish 和 Apache 有什麼關係?

您需要獲得更大的虛擬機。您開始發帖時告訴我們,由於記憶體耗盡和交換,您的虛擬機現在已經“啟動”了兩次。添加另一個受益於大量記憶體的應用程序對您的情況有何幫助?它不會。

讓我們分解一下你的小虛擬機及其記憶體使用情況。

首先,您有 512 MB 的 RAM。取其中的 100 到 125 MB (20-25%) 並將其從您的計算中完全刪除。您的核心需要此 RAM,支持程序、緩衝區和記憶體。這將為您留下 400 MB 的 RAM(分開差異)。

MySQL

假設您想使用 400 MB 的一半,給 MySQL 200 MB。讓我明確一點,我不熟悉 Drupal 的要求,或者它是否使用 MyISAM 或 InnoDB。如果您正在配置 InnoDB,您將使用該innodb_buffer_pool_size變數並將其設置為 200M。但是,您可以期望 MySQL 在查詢記憶體(如果使用)、打開表、連接處理、執行緒跟踪、排序緩衝區、連接緩衝區和無數其他配置選項等方面使用更多*。*如果您使用的是 MyISAM,它會更加複雜,因為涉及的變數更多,key_buffer而且myisam_sort_buffer只是其中的兩個。因此,假設 InnoDB 具有 200Minnodb_buffer_pool_size並且禁用了查詢記憶體,假設 MySQL 消耗 216 MB 的 RAM。

阿帕奇

您現在有 184 MB 的 RAM 可供 Apache 使用。首先,讓我們花點時間來弄清楚您的問題中一些真正令人困惑的事情。

我知道我應該通過 MaxClients 計算我的平均 Apache 程序大小(以 Mb 為單位),並且這個數字不應該超過系統可用的記憶體。

沒有。當您的站點正在使用時,您會觀察到平均 httpd 程序大小*。*使用每個 httpd 程序的平均大小(假設 prefork MPM,預設值),您可以計算出什麼MaxClients可以使您不超過分配給 httpd 或機器的記憶體,導致它交換。

根據 Top 的說法,每個程序大小略低於 7%(這將是大約 1.4Mb,對嗎?)。512/1.5 = 341…這對我來說似乎非常大。我是不是誤會了什麼?

是的,你是。首先,停止使用百分比來“計算”httpd 程序的大小。


編輯

等待!什麼?512 的 7% 是 35.84。我不確定你從哪裡得到 1.4 Mb。我的答案仍然有效,我不會調整我的答案來補償您的 35M httpd 程序。

結束編輯


httpd 程序的大小在RES列的頂部清楚地列出。例如:

top - 21:48:44 up 168 days,  4:46,  1 user,  load average: 0.02, 0.09, 0.08
Tasks:  66 total,   2 running,  64 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   2072832k total,  1994784k used,    78048k free,   407976k buffers
Swap:   787176k total,      300k used,   786876k free,  1321988k cached

 PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                       
8725 mysql     20   0  729m  69m 3396 S  0.0  3.4  53:45.84 mysqld                                                                                                         
22217 apache    20   0  161m  17m 7960 S  0.0  0.9   0:08.42 apache2                                                                                                        
26193 apache    20   0  161m  16m 6944 S  0.0  0.8   0:00.26 apache2                                                                                                        
4470 apache    20   0  161m  16m 6948 S  0.0  0.8   0:01.52 apache2                                                                                                        
6193 apache    20   0  161m  15m 6608 S  0.0  0.8   0:01.35 apache2                                                                                                        
4014 apache    20   0  161m  15m 6616 S  0.0  0.8   0:01.48 apache2                                                                                                        
6939 apache    20   0  161m  15m 6608 S  0.0  0.8   0:01.48 apache2                                                                                                        
6685 apache    20   0  161m  15m 6608 S  0.0  0.8   0:01.32 apache2                                                                                                        
26146 apache    20   0  161m  15m 6604 S  0.0  0.8   0:00.38 apache2                                                                                                        
6443 apache    20   0  161m  14m 5712 S  0.0  0.7   0:01.38 apache2                                                                                                        
26450 apache    20   0  161m  14m 5704 S  0.0  0.7   0:00.19 apache2                                                                                                        
2524 root      20   0  159m  13m 5524 S  0.0  0.6   0:03.34 apache2   

從技術上講,每個程序使用的記憶體是RESSHR(共享)的差異。這是因為SHR記憶體是由其他程序共享的。您可以在我向您展示的範例中看到,對於我的獨特案例,這平均約為 9 MB 。這只是一台執行 Cacti 的機器,幾乎沒有流量——如果我碰巧看到它,每天可能會點擊 5-10 次。我懷疑 Drupal 使用這麼少的記憶體,但你可以很容易地分辨出來。它絕對使用超過 1.4 MB。

現在,讓我們做一個非常不切實際的假設,即您的 httpd 程序每次都會使用甚至 10 MB 的 RAM。為 Apache “分配”了 184 MB 的 RAM,這使您的 MaxClients 為 18 (10 MB * 18 = 180 MB)。比341少得多*。*

首先,讓我們評估一下伺服器的目前狀態。假設您正確配置了 MySQL 和 httpd 以在負載下不交換,那麼您執行的 MySQL 配置和 httpd 配置非常貧乏,如果您收到超過 18 個並發請求,該配置將開始拒絕請求。從任何標準來看,這台機器都無法處理“快速增長”的流量。

現在您想添加第三個應用程序並為其分配 256MB 的 RAM?!該 RAM 必須來自 MySQL 或 Apache,也許您可以通過從作業系統本身竊取一些來僥倖逃脫。無論哪種方式,您都在進一步削弱您機器上的一項核心服務。

從技術上講,您可以在同一台主機上找到 Varnish、Apache 和 MySQL 的配置設置的最佳點,這使得所有主機都可以使用適量的 RAM 以理想的效率執行*,*但我對此表示懷疑。

解決方案

使用我教你的關於正確配置 MySQL 和 Apache 的內容來做到這一點:正確配置它們。你MaxClients應該不會接近 300,很可能低於 20,很可能低於 10。我沒有提到的另一件事是,當 httpd 程序的“峰值”遠高於平均水平時,它們可能有點不願意放棄 RAM。例如,如果一個 httpd 工作者的單個請求達到 20MB,那麼該工作者將繼續無限期地使用 20MB(afaik),直到它被收割。您可以通過降低MaxRequestsPerChild設置來解決此問題。降低這意味著更頻繁地獲取子程序。這會降低你在負載下的性能(分叉新程序相對昂貴),但它有助於保持你的記憶體使用可控。

正確配置您的伺服器不應該交換。如果您正確配置伺服器並看到諸如在負載下拒絕連接之類的問題,那麼我建議您擴展您的 VM,或者考慮在單獨的專用 VM 上添加 Varnish 。

通過閱讀文件和線上尋求幫助,您的開始是正確的。如果您遇到困難或需要深入幫助,請隨時提出另一個問題,但不要忘記先搜尋!你很有可能在另一個地方找到你的答案。

引用自:https://serverfault.com/questions/238982