Search squid archive

Re: "Quadruple" memory usage with squid

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The result of the test with vm.pmap.pg_ps_enabled set to 1
is ... different than what I expected.
The values of vm.pmap.pde.p_failures and vm.pmap.pde.demotions
indicate that the page daemon has problems creating and
maintaining superpages.  Maybe the load is too high
to create superpages or the algorithm of the page daemon
needs to be tuned.

Perhaps the FreeBSD list can offer more assistance
on the question of superpages and give an explanation
for the high values for vm.pmap.pde.p_failures and
vm.pmap.pde.demotions...
But one last try from me: The machine has 24 GB and Squid has
19 GB. I guess that on the first fork the OS demotes many
superpages because it needs to map the child process to
virtual memory and superpages cannot be swapped and therefore
will be demoted.  The second fork demotes more superpages...
To make the first fork fast, Squid must be
less than 10 GB because Squid and its child fit within
physical memory.  You will need a low value for
sleep_after_fork to do the exec before the next fork is
executed.

There are alternative solutions to the problem:
1. redesign the URL rewriter into a multithreaded application that
accepts multiple requests from Squid simultaneously (use
url_rewrite_concurrency in squid.conf)
This way there will be only one child process and only one fork on
'squid -k rotate'
2. redesign the URL rewriter where the URL rewriter rereads
its configuration/database on receipt of a signal and
send this signal every 24 hours without doing the 'squid -k rotate'
This way squid does not fork.
(maybe you want a 'squid -k rotate' once per week though).
3. modify the URL rewriter to accept multiple request
simultaneously (use url_rewrite_concurrency 4) and reduce the
number of rewriter to 4.  The URL rewritor will not be modified
to be multithreaded but simply queues the requests.
This way Squid does only 4 forks instead of 15.
4. use less URL rewriters. You might get an occasional
'not enough rewriters' warning from Squid in which case the
redirector might be bypassed (use url_rewrite_bypass).
Depending on what exactly the URL rewriter does, this
might be acceptable.
This way Squid does less forks.

option 1 requires a lot of work and is probable the best solution.
option 2 requires a lot of work and and is less robust than option 1
because at the time of the reconfiguration it cannot serve requests from Squid.
option 3 is most likely very simple but it is unknown how much it helps.
option 4 is simple, but depending on the functionality
of the rewriter, it is or is not acceptable.  You need to experiment
to see if it helps.

Marcus


Linda Messerschmidt wrote:
On Tue, Nov 24, 2009 at 9:52 PM, Marcus Kool
<marcus.kool@xxxxxxxxxxxxxxx> wrote:
Linda started this thread with huge performance problems
when Squid with a size of 12 GB forks 15 times.

I'm still not convinced that our memory usage is correct.  Here's
where the cache_mem 10GB process is at right now:

	Maximum Resident Size: 19376000 KB
	Total accounted:       9735764 KB
	Storage Mem size:	9296872 KB
	338229 StoreEntries
	338229 StoreEntries with MemObjects

So there is (9735764 - 9296872) 438,892 KB "overhead" (memory
accounted for that is not used for storing objects) and (19376000 -
9735764) 9,640,236 KB "unaccounted."

I will put the whole memory report at the bottom of this message
though it is very hard to read. :-)

Linda emailed me that she is doing a test with
vm.pmap.pg_ps_enabled set to 1 (the kernel will
transparently transform 4K pages into superpages)
which gives a big relief for TLB management
and will most likely reduce performance problems with
forks of very large processes.

I apologize I meant to send that to the whole list.

In any case, it did not help.  This is from top while it was doing
daily rotation a few moments ago:


  PID USERNAME  THR PRI NICE   SIZE    RES STATE   C   TIME   WCPU COMMAND
 1205 squid       1 118    0 18650M 18675M CPU6    1  57:22 97.85% squid
74418 squid       1 118    0 16259M    24K CPU2    2   0:05 97.66% squid

It doesn't look like the superpages enabled had a lot of effect:

$ sysctl vm.pmap
vm.pmap.pmap_collect_active: 0
vm.pmap.pmap_collect_inactive: 0
vm.pmap.pv_entry_spare: 6673
vm.pmap.pv_entry_allocs: 105465793
vm.pmap.pv_entry_frees: 100913786
vm.pmap.pc_chunk_tryfail: 0
vm.pmap.pc_chunk_frees: 610560
vm.pmap.pc_chunk_allocs: 637695
vm.pmap.pc_chunk_count: 27135
vm.pmap.pv_entry_count: 4552007   <--------
vm.pmap.pde.promotions: 12657 <------
vm.pmap.pde.p_failures: 222291
vm.pmap.pde.mappings: 0
vm.pmap.pde.demotions: 11968 <-------
vm.pmap.shpgperproc: 200
vm.pmap.pv_entry_max: 7330186
vm.pmap.pg_ps_enabled: 1

Here are similar readings from the 16GB machine, where the squid
process has VSZ of 8599M:

vm.pmap.pmap_collect_active: 0
vm.pmap.pmap_collect_inactive: 0
vm.pmap.pv_entry_spare: 16299
vm.pmap.pv_entry_allocs: 2196230824
vm.pmap.pv_entry_frees: 2193907723
vm.pmap.pc_chunk_tryfail: 0
vm.pmap.pc_chunk_frees: 13548719
vm.pmap.pc_chunk_allocs: 13562644
vm.pmap.pc_chunk_count: 13925
vm.pmap.pv_entry_count: 2323101  <------------
vm.pmap.pde.promotions: 0
vm.pmap.pde.p_failures: 0
vm.pmap.pde.mappings: 0
vm.pmap.pde.demotions: 0
vm.pmap.shpgperproc: 200
vm.pmap.pv_entry_max: 4276871
vm.pmap.pg_ps_enabled: 0

Squid uses almost all of the memory in use on both systems, so the
rough value of:

No superpages: 2323101 / 8599 = 270 pages per MB
Yes superpages: 4552007 / 18650 = 244 pages per MB

That's not quite fair since it's the whole system's page table vs.
squid's address space but these machines are all about squid so it's
fair enough.

I added up all the system's VSZ and divided it into the updated number
of pages; the system average is just 4.554KB per page, so it seems
like there must be barely any super pages in use, which is borne out
by the (promotions - demotions) figure of (12657 - 11968) 689 active
superpages.  Assuming that means what I think it means.

can we modify Squid to fork at a slower pace?

I think there is a config option (sleep_after_fork) for that already.
But it would not help as the processes are already forked one at a
time and the page table duplication happens before the exec.  Even if
it did help, sleep_after_fork would have to be several seconds, and
squid would still be nonresponsive for sleep_after_fork * 16.

It sounds like this problem is a bit more serious and complicated than
I thought.  I really hoped it was a config error on our part. :-(

Here is the full memory report as the process VSZ crossed over to
19,001 MB, which shows a total of 9,317,346 KB in use:

Current memory usage:
Pool	 Obj Size	Allocated					 In Use Idle			 Allocations Saved			 Hit Rate	
 	 (bytes)	(#)	 (KB)	 high (KB)	 high (hrs)	 impact (%total)	(#)	
(KB)	 high (KB)	 portion (%alloc)	(#)	 (KB)	 high (KB)	(number)	
(%num)	 (%vol)	(%num)	(number)
2K Buffer           	 2048	 96	 192	 248	 0.52	 0	 91	 182	 248	 95	
5	 10	 94	 34958835	 4.42	 18.12	 99.96	 34972340
4K Buffer           	 4096	 199	 796	 3904	 11.98	 0	 194	 776	 3904	
97	 5	 20	 1720	 7225790	 0.91	 7.49	 98.41	 7342427
8K Buffer           	 8192	 21	 168	 272	 12.05	 0	 17	 136	 272	 81	
4	 32	 176	 1880965	 0.24	 3.90	 98.40	 1911548
16K Buffer          	 16384	 3	 48	 64	 13.39	 0	 0	 0	 64	 0	 3	 48	
64	 3600	 0.00	 0.01	 98.41	 3658
32K Buffer          	 32768	 2	 64	 128	 14.56	 0	 0	 0	 128	 0	 2	
64	 128	 369	 0.00	 0.00	 98.14	 376
64K Buffer          	 65536	 2	 128	 192	 12.81	 0	 0	 0	 192	 0	 2	
128	 128	 88	 0.00	 0.00	 95.65	 92
Store Client Buffer 	 4096	 22	 88	 1052	 12.05	 0	 11	 44	 1052	 50	
11	 44	 812	 30568572	 3.87	 31.69	 99.74	 30646811
acl                 	   64	 11	 1	 1	 15.35	 0	 11	 1	 1	 100	 0	 0	
1	 11	 0.00	 0.00	 50.00	 22
acl_ip_data         	   24	 7	 1	 1	 15.35	 0	 7	 1	 1	 100	 0	 0	 1	
7	 0.00	 0.00	 50.00	 14
acl_list            	   24	 18	 1	 1	 15.35	 0	 18	 1	 1	 100	 0	 0	
1	 18	 0.00	 0.00	 50.00	 36
dlink_node          	   24	 337	 8	 8	 0.52	 0	 0	 0	 8	 0	 337	 8	 8	
1088	 0.00	 0.00	 76.35	 1425
FwdServer           	   24	 41	 1	 6	 12.05	 0	 9	 1	 6	 22	 32	 1	 5	
3875752	 0.49	 0.02	 99.87	 3880603
HttpReply           	  168	 338927	 55606	 55606	 0.00	 1	 338922
55605	 55606	 100	 5	 1	 23	 10817354	 1.37	 0.46	 96.17	 11248509
HttpHeaderEntry     	   40	 2602377	 101656	 101656	 0.00	 1	 2602282	
101652	 101656	 100	 95	 4	 101	 200511069	 25.36	 2.03	 98.06	
204487269
HttpHdrCc           	   40	 27921	 1091	 1091	 0.01	 0	 27914	 1091	
1091	 100	 7	 1	 3	 7294400	 0.92	 0.07	 99.17	 7355123
HttpHdrRangeSpec    	   16	 96	 2	 2	 13.43	 0	 0	 0	 2	 0	 96	 2	 2	
25596	 0.00	 0.00	 99.31	 25775
HttpHdrRange        	   16	 2	 1	 1	 12.07	 0	 0	 0	 1	 0	 2	 1	 1	
21759	 0.00	 0.00	 99.44	 21881
HttpHdrContRange    	   24	 5	 1	 1	 13.46	 0	 0	 0	 1	 0	 5	 1	 1	
10713	 0.00	 0.00	 97.21	 11021
intlist             	   16	 3	 1	 1	 15.35	 0	 3	 1	 1	 100	 0	 0	 1	
3	 0.00	 0.00	 50.00	 6
MemObject           	  272	 338920	 90026	 90026	 0.00	 1	 338915
90025	 90026	 100	 5	 2	 39	 5022931	 0.64	 0.35	 93.21	 5388889
mem_node            	 4112	 2338883	 9392078	 9392078	 0.00	 96	
2338871	 9392029	 9392078	 100	 12	 49	 3908	 15349368	 1.94	 15.98	
81.20	 18902877
relist              	   48	 8	 1	 1	 15.35	 0	 8	 1	 1	 100	 0	 0	 1	
8	 0.00	 0.00	 50.00	 16
request_t           	 1360	 341	 453	 893	 12.05	 0	 326	 433	 893	
96	 15	 20	 496	 9456631	 1.20	 3.26	 98.60	 9590792
StoreEntry          	   88	 338920	 29126	 29126	 0.00	 0	 338915
29126	 29126	 100	 5	 1	 13	 5025544	 0.64	 0.11	 93.26	 5388889
wordlist            	   16	 14	 1	 1	 15.35	 0	 11	 1	 1	 79	 3	 1	 1	
88	 0.00	 0.00	 86.27	 102
ClientInfo          	  344	 28096	 9439	 14657	 12.40	 0	 15714	 5279	
14657	 56	 12382	 4160	 4852	 653528	 0.08	 0.06	 93.63	 697962
MD5 digest          	   16	 338920	 5296	 5296	 0.00	 0	 338915 5296	
5296	 100	 5	 1	 3	 13112283	 1.66	 0.05	 97.40	 13462778
helper_request      	   40	 353	 14	 14	 0.52	 0	 1	 1	 14	 0	 352	
14	 14	 4805587	 0.61	 0.05	 99.99	 4805971
storeSwapTLV        	   24	 5	 1	 1	 15.32	 0	 0	 0	 1	 0	 5	 1	 1	
47627493	 6.02	 0.29	 100.00	 47627498
Short Strings       	   36	 2939320	 103336	 103336	 0.00	 1	 2939241	
103333	 103336	 100	 79	 3	 75	 219162796	 27.72	 2.00	 98.15	
223283726
Medium Strings      	  128	 15166	 1896	 1951	 0.52	 0	 15126	 1891	
1951	 100	 40	 5	 89	 50029245	 6.33	 1.62	 99.39	 50334410
Long Strings        	  512	 5927	 2964	 3002	 0.52	 0	 5911	 2956	
3002	 100	 16	 8	 143	 9251916	 1.17	 1.20	 99.22	 9325056
cbdata acl_access (1)	   56	 13	 1	 1	 15.35	 0	 13	 1	 1	 100	 0	 0	
1	 13	 0.00	 0.00	 50.00	 26
cbdata aclCheck_t (2)	  312	
daf
 1	 1	 1	 15.32	 0	 0	 0	 1	 0	 1	 1	 1	 22575783	 2.86	 1.78	 100.00	 22575832
cbdata clientHttpRequest (3)	 1096	 21	 23	 481	 0.52	 0	 15	 17	 481	
71	 6	 7	 387	 4735510	 0.60	 1.31	 98.21	 4821935
cbdata ConnStateData (4)	  320	 194	 61	 299	 11.98	 0	 190	 60	 299	
98	 4	 2	 137	 2604058	 0.33	 0.21	 97.41	 2673373
cbdata ErrorState (5)	  160	 200	 32	 32	 0.06	 0	 199	 32	 32	 100	
1	 1	 1	 16266	 0.00	 0.00	 98.79	 16466
cbdata FwdState (6) 	   96	 31	 3	 24	 12.05	 0	 9	 1	 24	 29	 22	 3	
20	 3871284	 0.49	 0.09	 99.76	 3880603
cbdata generic_cbdata (7)	   32	 30	 1	 4	 15.32	 0	 0	 0	 4	 0	 30	
1	 4	 14750620	 1.87	 0.12	 100.00	 14750938
cbdata helper (8)   	  136	 1	 1	 1	 15.35	 0	 1	 1	 1	 100	 0	 0	 0	
0	 0.00	 0.00	 0.00	 1
cbdata helper_server (9)	  152	 16	 3	 3	 15.35	 0	 16	 3	 3	 100	 0	
0	 3	 32	 0.00	 0.00	 66.67	 48
cbdata HttpStateData (12)	  152	 38	 6	 37	 12.05	 0	 9	 2	 37	 24	
29	 5	 32	 3874204	 0.49	 0.15	 99.85	 3880194
cbdata ps_state (14)	  200	 1	 1	 1	 15.32	 0	 0	 0	 1	 0	 1	 1	 1	
3880602	 0.49	 0.20	 100.00	 3880603
cbdata RemovalPolicy (15)	  104	 1	 1	 1	 15.35	 0	 1	 1	 1	 100	 0	
0	 0	 0	 0.00	 0.00	 0.00	 1
cbdata store_client (18)	  128	 167	 21	 45	 12.05	 0	 133	 17	 45	
80	 34	 5	 29	 8643422	 1.09	 0.28	 99.89	 8652735
event               	   48	 34	 2	 3	 12.38	 0	 31	 2	 3	 91	 3	 1	 1	
8007262	 1.01	 0.10	 99.96	 8010458
cbdata http_port_list (19)	  128	 2	 1	 1	 14.75	 0	 2	 1	 1	 100	 0	
0	 0	 0	 0.00	 0.00	 0.00	 2
cbdata body_size (20)	   64	 1	 1	 1	 15.35	 0	 1	 1	 1	 100	 0	 0	 1	
1	 0.00	 0.00	 50.00	 2
cbdata ConnectStateData (21)	   96	 16	 2	 11	 15.32	 0	 0	 0	 11	 0	
16	 2	 11	 3826157	 0.48	 0.09	 99.96	 3827561
close_handler       	   24	 236	 6	 31	 12.05	 0	 224	 6	 31	 95	 12	
1	 13	 14200692	 1.80	 0.09	 99.57	 14261946
ipcache_entry       	  128	 978	 123	 137	 13.32	 0	 951	 119	 137	
97	 27	 4	 22	 611237	 0.08	 0.02	 98.86	 618298
fqdncache_entry     	  160	 20	 4	 4	 15.35	 0	 20	 4	 4	 100	 0	 0	
4	 24	 0.00	 0.00	 54.55	 44
cbdata idns_query (22)	 8680	 2	 17	 941	 15.32	 0	 0	 0	 941	 0	 2	
17	 941	 616884	 0.08	 1.36	 99.78	 618218
cbdata redirectStateData (23)	   72	 353	 25	 25	 0.52	 0	 1	 1	 25	
0	 352	 25	 25	 4805595	 0.61	 0.09	 99.99	 4805971
cbdata Logfile (26) 	 1120	 3	 4	 4	 15.35	 0	 3	 4	 4	 100	 0	 0	 4	
3	 0.00	 0.00	 50.00	 6
pconn_data          	   32	 6	 1	 1	 13.34	 0	 1	 1	 1	 17	 5	 1	 1	
61876	 0.01	 0.00	 99.69	 62069
pconn_fds           	   32	 6	 1	 1	 13.34	 0	 1	 1	 1	 17	 5	 1	 1	
61889	 0.01	 0.00	 99.71	 62069
cbdata AddVaryState (29)	  160	 1	 1	 2	 12.38	 0	 0	 0	 2	 0	 1	 1	
2	 305954	 0.04	 0.01	 99.84	 306435
cbdata LocateVaryState (30)	  136	 3	 1	 1	 12.38	 0	 0	 0	 1	 0	 3	
1	 1	 571615	 0.07	 0.02	 99.99	 571661
VaryData            	   32	 6	 1	 1	 13.62	 0	 1	 1	 1	 17	 5	 1	 1	
570046	 0.07	 0.00	 99.72	 571661
cbdata StoreUpdateState (31)	 4152	 2	 9	 41	 12.34	 0	 0	 0	 41	 0	
2	 9	 41	 1044654	 0.13	 1.10	 99.71	 1047729
Total               	 -   	 9317346	 9794810	 9794810	 0.00	 100	
9303255	 9790117	 9790185	 100	 14091	 4693	 5120	 776329091	 98.19	
95.79	 98.19	 790614788
Cumulative allocated volume: 395.07 GB
Current overhead: 301304 bytes (0.003%)
Idle pool limit: 5.00 MB
memPoolAlloc calls: 790614788
memPoolFree calls: 781311532
String Pool	 Impact		
 	 (%strings)	 (%volume)
Short Strings       	 99	 96
Medium Strings      	 1	 2
Long Strings        	 0	 3
Other Strings       	 0	 0

Large buffers: 0 (0 KB)

Are we 100% certain this is normal / correct?  Cutting the process
size in half would double the process spawn rate. :)

Thanks!



[Index of Archives]     [Linux Audio Users]     [Samba]     [Big List of Linux Books]     [Linux USB]     [Yosemite News]

  Powered by Linux