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位用户区。