public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH]  Re: 2.4.9-ac15 painfully sluggish
  2001-09-25 16:25 Pau Aliagas
@ 2001-09-25 19:32 ` Rik van Riel
  2001-09-25 20:42   ` Jasper Spaans
                     ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Rik van Riel @ 2001-09-25 19:32 UTC (permalink / raw)
  To: Pau Aliagas; +Cc: lkml, Alan Cox, Roberto Orenstein, Francois Romieu

On Tue, 25 Sep 2001, Pau Aliagas wrote:

> The problem seems to be related in pages not moved to swap but
> being discarded somehow and reread later on.... just a guess.

I've made a small patch to 2.4.9-ac15 which should make
page_launder() smoother, make some (very minor) tweaks
to page aging and updates various comments in vmscan.c

It's below this email and at:

http://www.surriel.com/patches/2.4/2.4.9-ac15-age+launder

Since I failed to break 2.4.9-ac15 with this patch following
the instructions given to me by others, it would be nice to
know if the thing can still break on your machines.

Please test,

Rik
--
IA64: a worthy successor to the i860.

		http://www.surriel.com/
http://www.conectiva.com/	http://distro.conectiva.com/




--- linux-2.4.9-ac15/mm/vmscan.c.orig	Mon Sep 24 17:30:48 2001
+++ linux-2.4.9-ac15/mm/vmscan.c	Tue Sep 25 13:33:16 2001
@@ -28,19 +28,12 @@

 static inline void age_page_up(struct page *page)
 {
-	unsigned long age = page->age;
-	age += PAGE_AGE_ADV;
-	if (age > PAGE_AGE_MAX)
-		age = PAGE_AGE_MAX;
-	page->age = age;
+	page->age = min((int) (page->age + PAGE_AGE_ADV), PAGE_AGE_MAX);
 }

 static inline void age_page_down(struct page *page)
 {
-	unsigned long age = page->age;
-	if (age > 0)
-		age -= PAGE_AGE_DECL;
-	page->age = age;
+	page->age -= min(PAGE_AGE_DECL, (int)page->age);
 }

 /*
@@ -108,6 +101,23 @@
 	pte_t pte;
 	swp_entry_t entry;

+	/* Don't look at this pte if it's been accessed recently. */
+	if (ptep_test_and_clear_young(page_table)) {
+		age_page_up(page);
+		return;
+	}
+
+	/*
+	 * If the page is on the active list, page aging is done in
+	 * refill_inactive_scan(), anonymous pages are aged here.
+	 * This is done so heavily shared pages (think libc.so)
+	 * don't get punished heavily while they are still in use.
+	 * The alternative would be to put anonymous pages on the
+	 * active list too, but that increases complexity (for now).
+	 */
+	if (!PageActive(page))
+		age_page_down(page);
+
 	/*
 	 * If we have plenty inactive pages on this
 	 * zone, skip it.
@@ -133,23 +143,6 @@
 	pte = ptep_get_and_clear(page_table);
 	flush_tlb_page(vma, address);

-	/* Don't look at this pte if it's been accessed recently. */
-	if (ptep_test_and_clear_young(page_table)) {
-		age_page_up(page);
-		return;
-	}
-
-	/*
-	 * If the page is on the active list, page aging is done in
-	 * refill_inactive_scan(), anonymous pages are aged here.
-	 * This is done so heavily shared pages (think libc.so)
-	 * don't get punished heavily while they are still in use.
-	 * The alternative would be to put anonymous pages on the
-	 * active list too, but that increases complexity (for now).
-	 */
-	if (!PageActive(page))
-		age_page_down(page);
-
 	/*
 	 * Is the page already in the swap cache? If so, then
 	 * we can just drop our reference to it without doing
@@ -447,6 +440,7 @@
 				page_count(page) > (1 + !!page->buffers)) {
 			del_page_from_inactive_clean_list(page);
 			add_page_to_active_list(page);
+			page->age = max((int)page->age, PAGE_AGE_START);
 			continue;
 		}

@@ -536,34 +530,56 @@
  * @gfp_mask: what operations we are allowed to do
  * @sync: are we allowed to do synchronous IO in emergencies ?
  *
- * When this function is called, we are most likely low on free +
- * inactive_clean pages. Since we want to refill those pages as
- * soon as possible, we'll make two loops over the inactive list,
- * one to move the already cleaned pages to the inactive_clean lists
- * and one to (often asynchronously) clean the dirty inactive pages.
+ * This function is called when we are low on free / inactive_clean
+ * pages, its purpose is to refill the free/clean list as efficiently
+ * as possible.
  *
- * In situations where kswapd cannot keep up, user processes will
- * end up calling this function. Since the user process needs to
- * have a page before it can continue with its allocation, we'll
- * do synchronous page flushing in that case.
+ * This means we do writes asynchronously as long as possible and will
+ * only sleep on IO when we don't have another option. Since writeouts
+ * cause disk seeks and make read IO slower, we skip writes alltogether
+ * when the amount of dirty pages is small.
  *
  * This code is heavily inspired by the FreeBSD source code. Thanks
  * go out to Matthew Dillon.
  */
-#define MAX_LAUNDER 		(4 * (1 << page_cluster))
-#define CAN_DO_FS		(gfp_mask & __GFP_FS)
-#define CAN_DO_IO		(gfp_mask & __GFP_IO)
+#define	CAN_DO_FS	((gfp_mask & __GFP_FS) && should_write)
+#define	WRITE_LOW_WATER		5
+#define	WRITE_HIGH_WATER	10
 int page_launder(int gfp_mask, int sync)
 {
-	int launder_loop, maxscan, cleaned_pages, maxlaunder;
+	int maxscan, cleaned_pages, failed_pages, total;
 	struct list_head * page_lru;
 	struct page * page;

-	launder_loop = 0;
-	maxlaunder = 0;
+	/*
+	 * This flag determines if we should do writeouts of dirty data
+	 * or not.  When more than WRITE_HIGH_WATER percentage of the
+	 * pages we process would need to be written out we set this flag
+	 * and will do writeout, the flag is cleared once we go below
+	 * WRITE_LOW_WATER.  Note that only pages we actually process
+	 * get counted, ie. pages where we make it beyond the TryLock.
+	 *
+	 * XXX: These flags still need tuning.
+	 */
+	static int should_write = 0;
+
 	cleaned_pages = 0;
+	failed_pages = 0;
+
+	/*
+	 * The gfp_mask tells try_to_free_buffers() below if it should
+	 * wait do IO or may be allowed to wait on IO synchronously.
+	 *
+	 * Note that syncronous IO only happens when a page has not been
+	 * written out yet when we see it for a second time, this is done
+	 * through magic in try_to_free_buffers().
+	 */
+	if (!should_write)
+		gfp_mask &= ~(__GFP_WAIT | __GFP_IO);
+	else if (!sync)
+		gfp_mask &= ~__GFP_WAIT;

-dirty_page_rescan:
+	/* The main launder loop. */
 	spin_lock(&pagemap_lru_lock);
 	maxscan = nr_inactive_dirty_pages;
 	while ((page_lru = inactive_dirty_list.prev) != &inactive_dirty_list &&
@@ -580,26 +596,36 @@
 		}

 		/*
-		 * If the page is or was in use, we move it to the active
-		 * list. Note that pages in use by processes can easily
-		 * end up here to be unmapped later, but we just don't
-		 * want them clogging up the inactive list.
+		 * The page is in active use or really unfreeable. Move to
+		 * the active list and adjust the page age if needed.
 		 */
-		if ((PageReferenced(page) || page->age > 0 ||
-				page_count(page) > (1 + !!page->buffers) ||
-				page_ramdisk(page)) && !PageLocked(page)) {
+		if (PageReferenced(page) || page->age || page_ramdisk(page)) {
 			del_page_from_inactive_dirty_list(page);
 			add_page_to_active_list(page);
+			page->age = max((int)page->age, PAGE_AGE_START);
 			continue;
 		}

 		/*
-		 * If we have plenty free pages on a zone:
+		 * The page is still in the page tables of some process,
+		 * move it to the active list but leave page age at 0;
+		 * either swap_out() will make it freeable soon or it is
+		 * mlock()ed...
 		 *
-		 * 1) we avoid a writeout for that page if its dirty.
-		 * 2) if its a buffercache page, and not a pagecache
-		 * one, we skip it since we cannot move it to the
-		 * inactive clean list --- we have to free it.
+		 * The !PageLocked() test is to protect us from ourselves,
+		 * see the code around the writepage() call.
+		 */
+		if ((page_count(page) > (1 + !!page->buffers)) &&
+						!PageLocked(page)) {
+			del_page_from_inactive_dirty_list(page);
+			add_page_to_active_list(page);
+			continue;
+		}
+
+		/*
+		 * If this zone has plenty of pages free, don't spend time
+		 * on cleaning it but only move clean pages out of the way
+		 * so we won't have to scan those again.
 		 */
 		if (zone_free_plenty(page->zone)) {
 			if (!page->mapping || page_dirty(page)) {
@@ -633,11 +659,12 @@
 			if (!writepage)
 				goto page_active;

-			/* First time through? Move it to the back of the list */
-			if (!launder_loop || !CAN_DO_FS) {
+			/* Can't do it? Move it to the back of the list. */
+			if (!CAN_DO_FS) {
 				list_del(page_lru);
 				list_add(page_lru, &inactive_dirty_list);
 				UnlockPage(page);
+				failed_pages++;
 				continue;
 			}

@@ -664,9 +691,7 @@
 		 * buffer pages
 		 */
 		if (page->buffers) {
-			unsigned int buffer_mask;
 			int clearedbuf;
-			int freed_page = 0;
 			/*
 			 * Since we might be doing disk IO, we have to
 			 * drop the spinlock and take an extra reference
@@ -676,16 +701,8 @@
 			page_cache_get(page);
 			spin_unlock(&pagemap_lru_lock);

-			/* Will we do (asynchronous) IO? */
-			if (launder_loop && maxlaunder == 0 && sync)
-				buffer_mask = gfp_mask;				/* Do as much as we can */
-			else if (launder_loop && maxlaunder-- > 0)
-				buffer_mask = gfp_mask & ~__GFP_WAIT;			/* Don't wait, async write-out */
-			else
-				buffer_mask = gfp_mask & ~(__GFP_WAIT | __GFP_IO);	/* Don't even start IO */
-
-			/* Try to free metadata underlying the page. */
-			clearedbuf = try_to_release_page(page, buffer_mask);
+			/* Try to free the page buffers. */
+			clearedbuf = try_to_release_page(page, gfp_mask);

 			/*
 			 * Re-take the spinlock. Note that we cannot
@@ -697,11 +714,11 @@
 			/* The buffers were not freed. */
 			if (!clearedbuf) {
 				add_page_to_inactive_dirty_list(page);
+				failed_pages++;

 			/* The page was only in the buffer cache. */
 			} else if (!page->mapping) {
 				atomic_dec(&buffermem_pages);
-				freed_page = 1;
 				cleaned_pages++;

 			/* The page has more users besides the cache and us. */
@@ -722,13 +739,6 @@
 			UnlockPage(page);
 			page_cache_release(page);

-			/*
-			 * If we're freeing buffer cache pages, stop when
-			 * we've got enough free memory.
-			 */
-			if (freed_page && !free_shortage())
-				break;
-
 			continue;
 		} else if (page->mapping && !PageDirty(page)) {
 			/*
@@ -750,33 +760,22 @@
 			 */
 			del_page_from_inactive_dirty_list(page);
 			add_page_to_active_list(page);
+			page->age = max((int)page->age, PAGE_AGE_START);
 			UnlockPage(page);
 		}
 	}
 	spin_unlock(&pagemap_lru_lock);

 	/*
-	 * If we don't have enough free pages, we loop back once
-	 * to queue the dirty pages for writeout. When we were called
-	 * by a user process (that /needs/ a free page) and we didn't
-	 * free anything yet, we wait synchronously on the writeout of
-	 * MAX_SYNC_LAUNDER pages.
-	 *
-	 * We also wake up bdflush, since bdflush should, under most
-	 * loads, flush out the dirty pages before we have to wait on
-	 * IO.
+	 * Set the should_write flag, for the next callers of page_launder.
+	 * If we go below the low watermark we stop the writeout of dirty
+	 * pages, writeout is started when we get above the high watermark.
 	 */
-	if (CAN_DO_IO && !launder_loop && free_shortage()) {
-		launder_loop = 1;
-		/* If we cleaned pages, never do synchronous IO. */
-		if (cleaned_pages)
-			sync = 0;
-		/* We only do a few "out of order" flushes. */
-		maxlaunder = MAX_LAUNDER;
-		/* Kflushd takes care of the rest. */
-		wakeup_bdflush(0);
-		goto dirty_page_rescan;
-	}
+	total = failed_pages + cleaned_pages;
+	if (should_write && failed_pages * 100 < WRITE_LOW_WATER * total)
+		should_write = 0;
+	else if (!should_write && failed_pages * 100 > WRITE_HIGH_WATER * total)
+		should_write = 1;

 	/* Return the number of pages moved to the inactive_clean list. */
 	return cleaned_pages;
@@ -998,27 +997,26 @@
 	return progress;
 }

-
-
+/*
+ * Worker function for kswapd and try_to_free_pages, we get
+ * called whenever there is a shortage of free/inactive_clean
+ * pages.
+ *
+ * This function will also move pages to the inactive list,
+ * if needed.
+ */
 static int do_try_to_free_pages(unsigned int gfp_mask, int user)
 {
 	int ret = 0;

 	/*
-	 * If we're low on free pages, move pages from the
-	 * inactive_dirty list to the inactive_clean list.
-	 *
-	 * Usually bdflush will have pre-cleaned the pages
-	 * before we get around to moving them to the other
-	 * list, so this is a relatively cheap operation.
+	 * Eat memory from filesystem page cache, buffer cache,
+	 * dentry, inode and filesystem quota caches.
 	 */
-
-	if (free_shortage()) {
-		ret += page_launder(gfp_mask, user);
-		shrink_dcache_memory(0, gfp_mask);
-		shrink_icache_memory(0, gfp_mask);
-		shrink_dqcache_memory(DEF_PRIORITY, gfp_mask);
-	}
+	ret += page_launder(gfp_mask, user);
+	shrink_dcache_memory(0, gfp_mask);
+	shrink_icache_memory(0, gfp_mask);
+	shrink_dqcache_memory(DEF_PRIORITY, gfp_mask);

 	/*
 	 * If needed, we move pages from the active list
@@ -1028,7 +1026,7 @@
 		ret += refill_inactive(gfp_mask);

 	/*
-	 * Reclaim unused slab cache if memory is low.
+	 * Reclaim unused slab cache memory.
 	 */
 	kmem_cache_reap(gfp_mask);

@@ -1080,7 +1078,7 @@
 		static long recalc = 0;

 		/* If needed, try to free some memory. */
-		if (inactive_shortage() || free_shortage())
+		if (free_shortage())
 			do_try_to_free_pages(GFP_KSWAPD, 0);

 		/* Once a second ... */
@@ -1090,8 +1088,6 @@
 			/* Do background page aging. */
 			refill_inactive_scan(DEF_PRIORITY);
 		}
-
-		run_task_queue(&tq_disk);

 		/*
 		 * We go to sleep if either the free page shortage


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH]  Re: 2.4.9-ac15 painfully sluggish
  2001-09-25 19:32 ` [PATCH] " Rik van Riel
@ 2001-09-25 20:42   ` Jasper Spaans
  2001-09-25 20:52     ` Rik van Riel
  2001-09-26  7:36   ` Pau Aliagas
  2001-09-26 18:01   ` Kent Borg
  2 siblings, 1 reply; 7+ messages in thread
From: Jasper Spaans @ 2001-09-25 20:42 UTC (permalink / raw)
  To: Rik van Riel
  Cc: Pau Aliagas, lkml, Alan Cox, Roberto Orenstein, Francois Romieu

On Tue, Sep 25, 2001 at 04:32:13PM -0300, Rik van Riel wrote:

> > The problem seems to be related in pages not moved to swap but
> > being discarded somehow and reread later on.... just a guess.
> 
> I've made a small patch to 2.4.9-ac15 which should make
> page_launder() smoother, make some (very minor) tweaks
> to page aging and updates various comments in vmscan.c
> 
> It's below this email and at:
[snip]

With this -painfully applied- patch, all seems a lot better. However, it
still seems more sluggish than 2.4.9-ac12.

Haven't bothered testing -ac13 and -ac14.

Swapping still seems to be a problem though, as this kernel happily claims
several tens of MBs of swap, and then, out of the blue, starts writing pages
out in huge blocks.

The vmstat info just disappeared from my screen, while stressing the
vm-system by doing a large parallel build, however, it showed no paging
happening during long times (20-30 secs) and then suddenly writing 30 MB in
one go.

Doesn't seem very smooth to me, where can I get my refund? :)

(if you'd like more details, please ask, I can do some testing)

Regards,
-- 
  Q_.           Jasper Spaans <jasper@spaans.ds9a.nl>
 `~\            http://jsp.ds9a.nl/
Mr /\           Tel/Fax: +31-84-8749842
Zap             Move '.sig' for great justice!

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH]  Re: 2.4.9-ac15 painfully sluggish
  2001-09-25 20:42   ` Jasper Spaans
@ 2001-09-25 20:52     ` Rik van Riel
  0 siblings, 0 replies; 7+ messages in thread
From: Rik van Riel @ 2001-09-25 20:52 UTC (permalink / raw)
  To: Jasper Spaans
  Cc: Pau Aliagas, lkml, Alan Cox, Roberto Orenstein, Francois Romieu

On Tue, 25 Sep 2001, Jasper Spaans wrote:

> (if you'd like more details, please ask, I can do some testing)

Some 'vmstat -a' output would be helpful, as well as a
screen of top.

Rik
--
IA64: a worthy successor to the i860.

		http://www.surriel.com/
http://www.conectiva.com/	http://distro.conectiva.com/


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH]  Re: 2.4.9-ac15 painfully sluggish
  2001-09-25 19:32 ` [PATCH] " Rik van Riel
  2001-09-25 20:42   ` Jasper Spaans
@ 2001-09-26  7:36   ` Pau Aliagas
  2001-09-26 18:01   ` Kent Borg
  2 siblings, 0 replies; 7+ messages in thread
From: Pau Aliagas @ 2001-09-26  7:36 UTC (permalink / raw)
  To: Rik van Riel; +Cc: lkml, Alan Cox, Roberto Orenstein, Francois Romieu

On Tue, 25 Sep 2001, Rik van Riel wrote:

> On Tue, 25 Sep 2001, Pau Aliagas wrote:
>
> I've made a small patch to 2.4.9-ac15 which should make
> page_launder() smoother, make some (very minor) tweaks
> to page aging and updates various comments in vmscan.c

Ok, things improve vastly and the system is usable again. I cannot
"notice" any difference with ac10 in terms of speed.

I attach the top and vmstat outputs while running updatedb (reads all
the files in the filesystems) and starting evolution for the first time
(touches all the mail folders, that's hundreths of files). It starts
smoothly in seconds.

  9:30am  up 52 min,  5 users,  load average: 2,83, 2,35, 1,87
125 processes: 121 sleeping, 4 running, 0 zombie, 0 stopped
CPU states: 16,2% user,  7,9% system, 75,8% nice,  0,0% idle
Mem:   127072K av,  123336K used,    3736K free,    2360K shrd,    7988K buff
Swap:  401536K av,   54092K used,  347444K free                   33952K cached

  PID USER     PRI  NI  SIZE  RSS SHARE STAT %CPU %MEM   TIME COMMAND
 1008 setiatho  20  19 15348  14M   708 R N  76,2 11,4  38:28 setiathome
 1045 root       9   0 29740  12M  4076 S     7,3  9,6   9:05 X
 2238 pau        9   0  8876 8876  6764 D     4,1  6,9   0:00 evolution-mail
 1278 pau        9   0  4276 3776  3444 S     2,5  2,9   0:45 deskguide_apple
 2192 pau        9   0 16272  15M  6064 S     1,9 12,8   0:01 evolution
 1176 pau        9   0  1784 1456  1352 R     1,5  1,1   0:01 xscreensaver
    4 root       9   0     0    0     0 SW    0,9  0,0   0:02 kswapd
 2189 pau       13   0  1096 1096   840 R     0,9  0,8   0:00 top
 2258 pau        9   0  6024 6024  4632 S     0,9  4,7   0:00 evolution-pine-
 2198 pau        9   0  5616 5616  4360 D     0,7  4,4   0:00 wombat
 1127 pau        9   0  3424 3208  2032 S     0,3  2,5   0:03 sawfish
 1188 pau        9   0  5428 4972  4172 S     0,3  3,9   0:02 panel
 2265 pau        9   0  5372 5372  4216 S     0,3  4,2   0:00 evolution-gnome
  944 xfs        9   0  4748 2160  1768 D     0,1  1,6   0:01 xfs
 1198 pau        9   0  5232 3992  3472 S     0,1  3,1   0:02 gnome-terminal
 1944 root      19  19   716  676   496 R N   0,1  0,5   0:01 updatedb
 2093 pau        9   0   524  496   444 S     0,1  0,3   0:00 vmstat

   procs                      memory    swap          io     system         cpu
 r  b  w   swpd   free   buff  cache  si  so    bi    bo   in    cs  us  sy  id
 4  1  0  57552   3620  14280  42892   9  18    78    28  124   881  95   3   2
 1 11  0  54756   8220  14452  40896 386 115   614   163  244   560  96   4   0
 3  0  0  54660   7208  14720  41432 234   0   394     0  180   358  97   3   0
 5  0  0  54660   4952  15196  42508  74   0   381     0  162   295  98   2   0
 3  2  0  53856   5680  13244  42476 197   2   428    14  205   443  95   5   0
 2  4  0  53856   3668  13668  43212 170   0   395     6  180   399  97   3   0
 1  3  0  54004   5852  10324  42724 114   0   368     1  176   841  93   6   1
 4  0  0  54000   2800  10640  41908  19   0   314     2  151   764  95   5   0
 3  0  0  54024   6788   7568  39048   1   0   350     6  172   497  95   5   0
 1  2  0  54024   4656   7780  40192  78   0   347    11  163   524  96   4   0
 4  0  0  53972   2936   7944  38844 230   0   420     4  193  1370  94   6   0
 3  0  0  53972  12944   8420  39136  63   0   285    11  198  1262  96   4   0
 4  0  0  53972  11816   8836  39644  19   0   242    14  164   426  97   3   0
 4  0  0  53972  10532   9216  40252  31   0   222    17  215   834  96   4   0
 3  1  0  53972   8628   9504  40944  42   0   235     4  212   514  96   4   0
 2  1  0  53972   4040   9732  41636   0   0   173     2  210   798  95   5   0
 4  2  0  54160   3096   7188  40800  32   0   207    32  134  1502  87  13   0
 3  0  0  54332   3732   6412  35452  10   0   242    16  178   773  96   4   0
 4  0  0  54332   2800   7060  33908   0   0   232    16  204   506  96   4   0
 4  0  0  54072   4616   7096  34748   0 572   211   679  207   436  97   3   0
 3  2  0  54024   2800   7280  35364   0  12   244    18  216   726  97   3   0
 7  0  0  54020   3104   7644  34116  41   0   229     0  175   954  93   7   0
 3  1  0  54000   3744   7888  33852  62   0   374     0  193   722  97   3   0
 2  4  0  54092   4952   7988  33856   8   0   118   180  170  2934  91   9   0
 4  1  0  54036   2992   8024  34312  38   0   102   444  237  1684  92   8   0
 2  0  0  54036   3580   8216  35092   0   0   208     0  173   356  97   3   0
 3  0  0  55016   3820   8444  34912   3  67   293   136  165   279  90   2   8
 3  0  0  55016   2800   8724  34820   0   0   202    15  177   385  98   2   0
 4  0  0  55016   2948   9008  34704   0   0   258    14  175   372  98   2   0


Pau


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH]  Re: 2.4.9-ac15 painfully sluggish
  2001-09-25 19:32 ` [PATCH] " Rik van Riel
  2001-09-25 20:42   ` Jasper Spaans
  2001-09-26  7:36   ` Pau Aliagas
@ 2001-09-26 18:01   ` Kent Borg
  2 siblings, 0 replies; 7+ messages in thread
From: Kent Borg @ 2001-09-26 18:01 UTC (permalink / raw)
  To: Rik van Riel; +Cc: lkml

On Tue, Sep 25, 2001 at 04:32:13PM -0300, Rik van Riel wrote:
> I've made a small patch to 2.4.9-ac15 which should make
> page_launder() smoother, make some (very minor) tweaks
> to page aging and updates various comments in vmscan.c

Works for me.  I have the premption patch turned on.

On a 192 MB PIII laptop running at 500 MHz I have two X sessions
running, and have opened a zillion application windows on each,
including over a dozen Netscape windows, some Mozilla's, a couple
emacs's, a kernel compile, Staroffice.  About every app I can
immediately think of.  I haven't tried malloc-ing a ton of memory, but
this contrived real-world test works.

Swap is at 238 MB.  Lower than I would have expected, but that doesn't
mean I know anything.

Switching between X sessions just took near 10-seconds going, and only
about 5-seconds coming back.  Switching in Staroffice is painful, but
generally the responsiveness feels quite nice.

I like it.  Thanks,

-kb, the Kent who will be staying with 2.4.9-ac15, plus preemption
patch, plus this patch--once he figures out how to close all those
windows.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH]  Re: 2.4.9-ac15 painfully sluggish
@ 2001-09-27  4:27 Thomas Hood
  2001-09-27 12:01 ` Alan Cox
  0 siblings, 1 reply; 7+ messages in thread
From: Thomas Hood @ 2001-09-27  4:27 UTC (permalink / raw)
  To: linux-kernel

I know next to nothing about these VM issues, but here's
another data point:

2.4.9-ac15 was painfully sluggish on my ThinkPad 600,
Pentium II, 120 MB RAM system just running galeon
or compiling a kernel.  The disk would begin thrashing
and continue doing so for many minutes.  Swap usage was
reported as zero the whole time.

I applied the "2.4.9-ac15-age+launder" patch and things
improved dramatically.

--

Thomas

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH]  Re: 2.4.9-ac15 painfully sluggish
  2001-09-27  4:27 [PATCH] Re: 2.4.9-ac15 painfully sluggish Thomas Hood
@ 2001-09-27 12:01 ` Alan Cox
  0 siblings, 0 replies; 7+ messages in thread
From: Alan Cox @ 2001-09-27 12:01 UTC (permalink / raw)
  To: Thomas Hood; +Cc: linux-kernel

> or compiling a kernel.  The disk would begin thrashing
> and continue doing so for many minutes.  Swap usage was
> reported as zero the whole time.

Ac15 had a merge error

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2001-09-27 11:56 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2001-09-27  4:27 [PATCH] Re: 2.4.9-ac15 painfully sluggish Thomas Hood
2001-09-27 12:01 ` Alan Cox
  -- strict thread matches above, loose matches on Subject: below --
2001-09-25 16:25 Pau Aliagas
2001-09-25 19:32 ` [PATCH] " Rik van Riel
2001-09-25 20:42   ` Jasper Spaans
2001-09-25 20:52     ` Rik van Riel
2001-09-26  7:36   ` Pau Aliagas
2001-09-26 18:01   ` Kent Borg

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox