在 512mb VPS 上在 Varnish 後面配置 HTTPD
我在具有 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 的數量。
- 如果我確實安裝了 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
從技術上講,每個程序使用的記憶體是
RES
和SHR
(共享)的差異。這是因為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 。
通過閱讀文件和線上尋求幫助,您的開始是正確的。如果您遇到困難或需要深入幫助,請隨時提出另一個問題,但不要忘記先搜尋!你很有可能在另一個地方找到你的答案。