Squid內存相關
https://wiki.squid-cache.org/SquidFaq/SquidMemory
爲什麼Squid使用那麼多的內存!
出於性能原因,Squid使用了大量內存。從磁盤讀取內容要比直接從內存讀取花費更多,更長的時間。
每個緩存對象的少量元數據都保存在內存中。這是StoreEntry數據結構。在32位體系結構上爲56字節,在64位體系結構上爲88字節。此外,每個StoreEntry都有一個16字節的緩存鍵(MD5校驗和)。這意味着緩存中每個對象的內存中有72或104字節的元數據。因此,具有1,000,000個對象的緩存僅需要72MB的內存用於元數據。實際上,它所需要的遠遠不止這些。
Uses of memory by Squid include:
reason | parameter | explanation |
---|---|---|
Disk buffers for reading and writing | - | - |
Network I/O buffers | read_ahead_gap * | D |
IP Cache contents | ipcache_size | DNS |
FQDN Cache contents | fqdncache_size | DNS |
Netdb ICMP measurement database | - | N |
Per-request state information, including full request and reply headers | - | D |
Miscellaneous statistics collection | - | D |
Index of on-disk cache (metadata, kept in memory) | cache_dir | I |
In-memory cache with "hot objects" | cache_mem | M+I |
Explanation of letters:
. | explanation |
---|---|
D | dynamic; more memory is used if more users visit more websites |
I | 10 MB of memory per 1 GB on disk for 32-bit Squid 14 MB of memory per 1 GB on disk for 64-bit Squid |
N | not used often |
M | rule of thumb: cache_mem is usually one third of the total memory consumption. On top of the value configured there is also memory used by the index of these objects (see 'I'). |
DNS | not recommended to change. Only increase for very large caches or if there is a slow DNS server |
-
不是很明白
- read_ahead_gap僅限制從服務器讀取但尚未傳遞到客戶端的數據窗口。至少有兩個緩衝區(客戶端到服務器和服務器到客戶端的方向),而對於當前事務正在通過的每個ICAP服務,又有一個緩衝區。
還有間接使用的內存:操作系統具有用於TCP連接和文件系統I / O的緩衝區。
我該如何判斷我的Squid進程正在使用多少內存?
-
ps -aux
wessels ~ 236% ps -axuhm USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND squid 9631 4.6 26.4 141204 137852 ?? S 10:13PM 78:22.80 squid -NCYs
-
top
last pid: 20128; load averages: 0.06, 0.12, 0.11 14:10:58 46 processes: 1 running, 45 sleeping CPU states: % user, % nice, % system, % interrupt, % idle Mem: 187M Active, 1884K Inact, 45M Wired, 268M Cache, 8351K Buf, 1296K Free Swap: 1024M Total, 256K Used, 1024M Free PID USERNAME PRI NICE SIZE RES STATE TIME WCPU CPU COMMAND 9631 squid 2 0 138M 135M select 78:45 3.93% 3.93% squid
-
要求Squid進程報告其自身的內存使用情況
這在“緩存管理器” 信息頁面上可用。您的輸出可能會有所不同,具體取決於您的操作系統和Squid版本,但看起來與此類似:
魷魚的資源使用情況: 最大常駐大小:137892 KB 通過mstats()獲取魷魚的內存使用情況: 舞臺上的總空間:140144 KB 總計免費:8153 KB 6%
如果您的RSS(居民集大小)值遠低於您的進程大小,則您的緩存性能很可能會因分頁而受到影響
可查看cache_manager的相關信息:
爲什麼Squid使用這麼多的緩存?
看來運行Squid的計算機正在使用大量內存“緩存的內存”
KiB Mem: 4037016 total, 3729152 used, 307864 free, 120508 buffers KiB Swap: 8511484 total, 0 used, 8511484 free. 2213580 cached Mem
這是Linux中的正常行爲-只要有可用內存,從磁盤讀取的所有內容都會緩存在RAM中。 如果以其他方式需要RAM,則會減少內存中的緩存。另請參閱https://www.linuxatemyram.com/
運行Squid的計算機可能會顯示異常數量的磁盤I / O緩存,因爲Squid緩存包含大量文件並隨機訪問它們
Squid增長沒有限制
您可能只是將cache_mem參數設置得太高。請參閱如何減少Squid的內存使用量?下面。
當進程的大小持續增長而又不趨於平穩或變慢時,通常表示內存泄漏。內存泄漏是指使用了一些內存塊,但使用完畢後沒有釋放。
對於程序(如Squid)而言,內存泄漏是一個真正的問題,因爲它們在一個進程中完成所有處理。從歷史上看,Squid確實存在內存泄漏問題。但是隨着軟件的成熟,我們相信幾乎所有Squid的內存泄漏都已消除,並且最不容易發現新的內存泄漏。
系統庫(例如libc.a甚至libmalloc.a)中也可能存在內存泄漏。如果您遇到不斷增長的進程大小現象,建議您首先嚐試
我設置cache_mem爲XX,但是squid進程所使用的大小超過了它
該cache_mem參數不指定進程的最大尺寸。它僅指定用於緩存“熱門”(非常流行)對象的內存量。Squid的實際內存使用量在很大程度上取決於您的cache_dir大小(磁盤空間)和傳入請求負載。減少cache_mem通常也會減少進程的大小,但不是必須的,還有其他方法可以減少Squid的內存使用
另請參閱Squid服務器中需要多少內存?。
如何從緩存管理器輸出中分析內存使用情況?
查看您的cachemgr.cgi 緩存信息頁面
Memory usage for squid via mallinfo(): Total space in arena: 94687 KB Ordinary blocks: 32019 KB 210034 blks Small blocks: 44364 KB 569500 blks Holding blocks: 0 KB 5695 blks Free Small blocks: 6650 KB Free Ordinary blocks: 11652 KB Total in use: 76384 KB 81% Total free: 18302 KB 19% Meta Data: StoreEntry 246043 x 64 bytes = 15377 KB IPCacheEntry 971 x 88 bytes = 83 KB Hash link 2 x 24 bytes = 0 KB URL strings = 11422 KB Pool MemObject structures 514 x 144 bytes = 72 KB ( 70 free) Pool for Request structur 516 x 4380 bytes = 2207 KB ( 2121 free) Pool for in-memory object 6200 x 4096 bytes = 24800 KB ( 22888 free) Pool for disk I/O 242 x 8192 bytes = 1936 KB ( 1888 free) Miscellaneous = 2600 KB total Accounted = 58499 KB
fork:(12)無法分配內存
解決此問題的最佳方法是通過添加交換空間來增加虛擬內存。通常,您的系統使用原始磁盤分區作爲交換空間,但是大多數操作系統也支持常規文件的交換(Digital Unix除外)。有關swap,swapon和mkfile的信息,請參見系統手冊。另外,您可以使用sleep_after_fork指令在調用輔助程序時使Squid稍微睡眠一下,以允許該輔助程序在嘗試啓動下一個之前啓動。如果您發現Squid有時無法在“ squid -k reconfigure”上重新啓動所有幫助程序,則這將很有幫助。
如何減少Squid的內存使用量?
如果由於內存限制而使高速緩存性能下降,則可以考慮購買更多的內存。但是,如果這不是一種選擇,那麼可以嘗試以下方法:
-
嘗試使用其他malloc庫(請參見下文)
-
減少配置文件中的cache_mem參數。這可以控制在內存中保留多少“熱”對象。減少此參數不會顯着影響性能,但是如果您的緩存繁忙,您可能會在cache.log中收到一些警告。
-
關閉memory_pools關在配置文件中。這導致Squid通過調用free()放棄未使用的內存,而不是保留該塊以備將來使用。一般來說,這是一個壞主意,因爲它會導致堆碎片。請改用 memory_pools_limit。
-
減少配置文件中的cache_swap_low或cache_dir參數。這將減少Squid保留的對象數量。您的總體命中率可能會下降一點,但是緩存的性能會明顯更好。
使用備用的malloc庫
將Squid與外部malloc庫鏈接時,許多用戶發現性能和內存利用率得到了提高。我們建議使用GNU malloc或dlmalloc。
我的Squid服務器需要多少內存?
根據經驗,Squid每GB的所有cache_dirs總數大約使用10 MB的RAM(在64位服務器(例如Alpha)上更多),再加上cache_mem設置以及大約10-20MB。建議您的Squid服務器上至少有兩倍於此數量的物理RAM。有關Squid的內存使用情況的詳細討論,請參見以上各節。
除了Squid所使用的內存外,操作系統還建議使用建議的額外RAM,以提高磁盤I / O性能以及服務器上運行的其他應用程序或服務。即使將Squid作爲唯一的tcp服務運行的服務器也是如此,因爲進程管理,日誌記錄和其他OS級別例程需要的內存最低級別。
如果您的服務器內存不足且磁盤很大,那麼您將不一定能夠使用所有磁盤空間,因爲當緩存填滿時,可用內存將不足,從而迫使Squid換出內存並影響性能。很大的cache_dir總數以及不足的物理RAM +交換可能會導致Squid完全停止運行。更大的緩存的解決方案是獲得更多的物理RAM。通過cache_mem向Squid分配更多資源將無濟於事。
爲什麼我的Squid過程無法增長到一定大小?
由[ AdrianChadd Adrian Chadd]
許多人運行的Squid內存超過1GB。這裏有一些事情要記住。
-
操作系統可能會限制每個進程可用的內存量。檢查資源限制(/ PAM系統下的/etc/security/limits.conf或類似內容,“ ulimit”等)
-
操作系統可能會限制進程的大小。有時將32位平臺“拆分”爲2gb進程/ 2gb內核;可以通過內核重新編譯或引導時選項將其更改爲3gb進程/ 1gb內核。有關詳細信息,請查閱操作系統的文檔。
-
某些malloc實現可能不支持> 2gb的內存-例如dlmalloc。除非您的平臺嚴重損壞,否則請不要使用dlmalloc(然後您將意識到使用它不能使用> 2gb RAM)。
-
確保將Squid編譯爲64位二進制文件(對於現代的類Unix操作系統,您可以使用'file'命令來實現);一些平臺可能具有64位內核但具有32位用戶區,或者編譯器可能默認爲32位用戶區。