squid內存相關

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的相關信息:

https://wiki.squid-cache.org/action/show/Features/CacheManager?action=show&redirect=SquidFaq%2FCacheManager

爲什麼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除外)。有關swapswaponmkfile的信息,請參見系統手冊。另外,您可以使用sleep_after_fork指令在調用輔助程序時使Squid稍微睡眠一下,以允許該輔助程序在嘗試啓動下一個之前啓動。如果您發現Squid有時無法在“ squid -k reconfigure”上重新啓動所有幫助程序,則這將很有幫助。

如何減少Squid的內存使用量?

如果由於內存限制而使高速緩存性能下降,則可以考慮購買更多的內存。但是,如果這不是一種選擇,那麼可以嘗試以下方法:

  • 嘗試使用其他malloc庫(請參見下文)

  • 減少配置文件中的cache_mem參數。這可以控制在內存中保留多少“熱”對象。減少此參數不會顯着影響性能,但是如果您的緩存繁忙,您可能會在cache.log中收到一些警告。

  • 關閉memory_pools關在配置文件中。這導致Squid通過調用free()放棄未使用的內存,而不是保留該塊以備將來使用。一般來說,這是一個壞主意,因爲它會導致堆碎片。請改用 memory_pools_limit

  • 減少配置文件中的cache_swap_lowcache_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位用戶區。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章