Skip to contentSkip to conversation

tcp_mem initialization

PATCH In review John Heffner 2 participants 4 messages Mar 14, 2007 – Mar 16, 2007

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 tcp_mem initialization

The current tcp_mem initialization gives values that are really too small for systems with ~256-768 MB of memory, and also for systems with larger page sizes (ia64). This patch gives an alternate method of initialization that doesn't depend on the cache allocation functions, but I think should still provide a nice curve that gives a smaller fraction of total memory with small-memory systems, while maintaining the same upper bound (pressure at 1/2, max as 3/4) on larger memory systems.

-John

Change tcp_mem initialization function. The fraction of total memory is now a continuous function of memory size, and independent of page size.

---
commit a4461a36efb376bf01399cfd6f1ad15dc89a8794
tree 23b2fb9da52b45de8008fc7ea6bb8c10e3a3724b
parent 8b9909ded6922c33c221b105b26917780cfa497d
author John Heffner <[email protected]> Wed, 14 Mar 2007 17:15:06 -0400 committer John Heffner <[email protected]> Wed, 14 Mar 2007 17:15:06 -0400

 net/ipv4/tcp.c |   13 ++++++++++---
 1 files changed, 10 insertions(+), 3 deletions(-)
net/ipv4/tcp.c +10 -3
index 74c4d10..3834b10 100644
@@ -2458,11 +2458,18 @@ void __init tcp_init(void)
 		sysctl_max_syn_backlog = 128;
 	}
 
-	/* Allow no more than 3/4 kernel memory (usually less) allocated to TCP */
-	sysctl_tcp_mem[0] = (1536 / sizeof (struct inet_bind_hashbucket)) << order;
-	sysctl_tcp_mem[1] = sysctl_tcp_mem[0] * 4 / 3;
+	/* Set the pressure threshold to be a fraction of global memory that
+	 * is up to 1/2 at 256 MB, decreasing toward zero with the amount of
+	 * memory, with a floor of 128 pages.
+	 */
+	limit = min(nr_all_pages, 1UL<<(28-PAGE_SHIFT)) >> (20-PAGE_SHIFT);
+	limit = (limit * (nr_all_pages >> (20-PAGE_SHIFT))) >> (PAGE_SHIFT-11);
+	limit = max(limit, 128UL);
+	sysctl_tcp_mem[0] = limit / 4 * 3;
+	sysctl_tcp_mem[1] = limit;
 	sysctl_tcp_mem[2] = sysctl_tcp_mem[0] * 2;
 
+	/* Set per-socket limits to no more than 1/128 the pressure threshold */
 	limit = ((unsigned long)sysctl_tcp_mem[1]) << (PAGE_SHIFT - 7);
 	max_share = min(4UL*1024*1024, limit);
 
maintainer
#1 lore raw

From: John Heffner <[email protected]>
Date: Wed, 14 Mar 2007 17:25:22 -0400

Quoted 7 lines

The current tcp_mem initialization gives values that are really too small for systems with ~256-768 MB of memory, and also for systems with larger page sizes (ia64). This patch gives an alternate method of initialization that doesn't depend on the cache allocation functions, but I think should still provide a nice curve that gives a smaller fraction of total memory with small-memory systems, while maintaining the same upper bound (pressure at 1/2, max as 3/4) on larger memory systems.

Indeed, it's really dumb for any of these calculations to be dependant upon the page size.

Your patch looks good, and I'll review it further tomorrow and push upstream unless I find some issues with it.

Thanks John.

#2 lore raw
Quoted 5 lines · David Miller

From: John Heffner <[email protected]>
Date: Wed, 14 Mar 2007 17:25:22 -0400

Quoted 1 line

The current tcp_mem initialization gives values that are really too small for systems with ~256-768 MB of memory, and also for systems with larger page sizes (ia64). This patch gives an alternate method of initialization that doesn't depend on the cache allocation functions, but I think should still provide a nice curve that gives a smaller fraction of total memory with small-memory systems, while maintaining the same upper bound (pressure at 1/2, max as 3/4) on larger memory systems.

Quoted 7 lines

Indeed, it's really dumb for any of these calculations to be dependant upon the page size.

Your patch looks good, and I'll review it further tomorrow and push upstream unless I find some issues with it.

Thanks John.

The way it's coded is somewhat opaque since it has to be done with 32-bit integer arithmetic. These plots might help make the motivation behind the code a little clearer.

Thanks,
-John

maintainer
#3 lore raw

From: John Heffner <[email protected]>
Date: Thu, 15 Mar 2007 14:39:29 -0400

Quoted 3 lines

The way it's coded is somewhat opaque since it has to be done with 32-bit integer arithmetic. These plots might help make the motivation behind the code a little clearer.

Thanks John.

I was going to write a little test program to spit out the values for a given range of memory sizes but your graphs are much better :-)