Hi,
My name is Rodrigo Wanderley, I'm just another one working at a ISP ;). My
interest in squid began few weeks ago when our manager thought it would be nice
if we had a proxy-cache. I loved the program and started reading the code last
week. Liked it a lot, and would like to read more about how the development is
going and the ideas that you guys have.
I also made a tiny little patch yesterday, and wanted to discuss the
performance issues of it. The problem was that it was hard to guess the exact
size to put in maximum_object_size. We would like to cache big files from
certain sites (like windowsupdate) and let a small default for the others.
Well, what I did (or tryed to do) was mimic the reply-body-max-size option thus
adding acl to the maximum-object-size.
What I want to do now is profile it and see if putting acls into that option
is a overkill. Reading the list archives I saw two main options, gprof and a
patch in squid to enable profiling and view the results in the cachemgr. Since
the later is not at the code I wander if patching the squid for profiling is
really the best option...
Attached is the patch I did.
thanks,
RSW
Index: src/cf.data.pre
===================================================================
--- src/cf.data.pre (revision 1378)
+++ src/cf.data.pre (working copy)
@@ -603,24 +603,6 @@
numbers closer together.
DOC_END
-NAME: maximum_object_size
-COMMENT: (bytes)
-TYPE: b_size_t
-DEFAULT: 4096 KB
-LOC: Config.Store.maxObjectSize
-DOC_START
- Objects larger than this size will NOT be saved on disk. The
- value is specified in kilobytes, and the default is 4MB. If
- you wish to get a high BYTES hit ratio, you should probably
- increase this (one 32 MB object hit counts for 3200 10KB
- hits). If you wish to increase speed more than your want to
- save bandwidth you should leave this low.
-
- NOTE: if using the LFUDA replacement policy you should increase
- this value to maximize the byte hit rate improvement of LFUDA!
- See replacement_policy below for a discussion of this policy.
-DOC_END
-
NAME: minimum_object_size
COMMENT: (bytes)
TYPE: b_size_t
@@ -2411,6 +2393,18 @@
buffer-overflow or denial-of-service attacks.
DOC_END
+NAME: maximum_object_size
+COMMENT: bytes allow|deny acl acl...
+TYPE: body_size_t
+DEFAULT: none
+DEFAULT_IF_NONE: 4194304 allow all
+LOC: Config.Store.maxObjectSize
+DOC_START
+ This option specifies the maximum object size that will be cached
+ on disk. The first "allow" rule that match will be the one that
+ will be used.
+DOC_END
+
NAME: reply_body_max_size
COMMENT: bytes allow|deny acl acl...
TYPE: body_size_t
Index: src/cache_cf.c
===================================================================
--- src/cache_cf.c (revision 1378)
+++ src/cache_cf.c (working copy)
@@ -471,24 +471,6 @@
debug(22, 0) ("NOTICE: positive_dns_ttl must be larger than
negative_dns_ttl. Resetting negative_dns_ttl to match\n");
Config.positiveDnsTtl = Config.negativeDnsTtl;
}
-#if SIZEOF_SQUID_FILE_SZ <= 4
-#if SIZEOF_SQUID_OFF_T <= 4
- if (Config.Store.maxObjectSize > 0x7FFF0000) {
- debug(22, 0) ("NOTICE: maximum_object_size limited to %d KB due to
hardware limitations\n", 0x7FFF0000 / 1024);
- Config.Store.maxObjectSize = 0x7FFF0000;
- }
-#elif SIZEOF_OFF_T <= 4
- if (Config.Store.maxObjectSize > 0xFFFF0000) {
- debug(22, 0) ("NOTICE: maximum_object_size limited to %d KB due to OS
limitations\n", 0xFFFF0000 / 1024);
- Config.Store.maxObjectSize = 0xFFFF0000;
- }
-#else
- if (Config.Store.maxObjectSize > 0xFFFF0000) {
- debug(22, 0) ("NOTICE: maximum_object_size limited to %d KB to keep
compatibility with existing cache\n", 0xFFFF0000 / 1024);
- Config.Store.maxObjectSize = 0xFFFF0000;
- }
-#endif
-#endif
if (Config.Store.maxInMemObjSize > 8 * 1024 * 1024)
debug(22, 0) ("WARNING: Very large maximum_object_size_in_memory
settings can have negative impact on performance\n");
}
Index: src/store.c
===================================================================
--- src/store.c (revision 1378)
+++ src/store.c (working copy)
@@ -611,6 +611,35 @@
return 0;
}
+static int
+storeCheckTooBig(StoreEntry * e)
+{
+ body_size *bs;
+ aclCheck_t *checklist;
+ request_t *request = e->mem_obj->request;
+
+ bs = (body_size *) Config.Store.maxObjectSize.head;
+ while (bs) {
+ checklist = aclChecklistCreate(bs->access_list, request, NULL);
+
+ if (1 != aclCheckFast(bs->access_list, checklist)) {
+ /* deny - skip this entry */
+ bs = (body_size *) bs->node.next;
+ } else {
+ debug(20,3) ("storeCheckTooBig: file has: %"
PRINTF_OFF_T ", max is: %" PRINTF_OFF_T "\n",
+ e->mem_obj->inmem_hi, bs->maxsize);
+ /* Allow - use this entry */
+ return ((e->mem_obj->reply->content_length > 0 &&
+ e->mem_obj->reply->content_length >
bs->maxsize) ||
+ e->mem_obj->inmem_hi > bs->maxsize);
+ }
+ aclChecklistFree(checklist);
+ }
+ /* Did not match any allow match, do not cache it. */
+ debug(20, 1) ("storeCheckTooBig: did not match any allow acl, not
caching!\n");
+ return 1;
+}
+
int
storeCheckCachable(StoreEntry * e)
{
@@ -633,9 +662,7 @@
debug(20, 3) ("storeCheckCachable: NO: negative cached\n");
store_check_cachable_hist.no.negative_cached++;
return 0; /* avoid release call below */
- } else if ((e->mem_obj->reply->content_length > 0 &&
- e->mem_obj->reply->content_length > Config.Store.maxObjectSize)
||
- e->mem_obj->inmem_hi > Config.Store.maxObjectSize) {
+ } else if (storeCheckTooBig(e)) {
debug(20, 2) ("storeCheckCachable: NO: too big\n");
store_check_cachable_hist.no.too_big++;
} else if (storeCheckTooSmall(e)) {
Index: src/structs.h
===================================================================
--- src/structs.h (revision 1378)
+++ src/structs.h (working copy)
@@ -556,7 +556,7 @@
struct {
int objectsPerBucket;
squid_off_t avgObjectSize;
- squid_off_t maxObjectSize;
+ dlink_list maxObjectSize;
squid_off_t minObjectSize;
squid_off_t maxInMemObjSize;
} Store;
Index: src/store_swapout.c
===================================================================
--- src/store_swapout.c (revision 1378)
+++ src/store_swapout.c (working copy)
@@ -381,8 +381,6 @@
static int
storeSwapOutAble(const StoreEntry * e)
{
- if (e->mem_obj->inmem_hi > Config.Store.maxObjectSize)
- return 0;
if (!EBIT_TEST(e->flags, ENTRY_CACHABLE))
return 0;
if (e->mem_obj->swapout.sio != NULL)