At 09.18 04/11/01 -0800, Linus Torvalds wrote:
>
>On Sun, 4 Nov 2001, Lorenzo Allegrucci wrote:
>>
>> I begin with the last Linus' kernel, three runs and kswapd CPU
>> time appended.
>
>It's interesting how your numbers decrease with more swap-space. That,
>together with the fact that the "more swap space" case also degrades the
>second time around seems to imply that we leave swap-cache pages around
>after they aren't used.
>
>Does "free" after a run has completed imply that there's still lots of
>swap used? We _should_ have gotten rid of it at "free_swap_and_cache()"
>time, but if we missed it..
lenstra:~/src/qsort> free
             total       used       free     shared    buffers     cached
Mem:        255984      16760     239224          0       1092       8008
-/+ buffers/cache:       7660     248324
Swap:       195512          0     195512
lenstra:~/src/qsort> time ./qsbench -n 90000000 -p 1 -s 140175100
70.590u 7.640s 2:31.06 51.7%    0+0k 0+0io 19036pf+0w
lenstra:~/src/qsort> free
             total       used       free     shared    buffers     cached
Mem:        255984       6008     249976          0        100       1096
-/+ buffers/cache:       4812     251172
Swap:       195512       5080     190432
and with more swap..
lenstra:~/src/qsort> free
             total       used       free     shared    buffers     cached
Mem:        255984      13488     242496          0        532       5360
-/+ buffers/cache:       7596     248388
Swap:       390592          0     390592
lenstra:~/src/qsort> time ./qsbench -n 90000000 -p 1 -s 140175100
70.180u 7.650s 2:43.22 47.6%    0+0k 0+0io 21019pf+0w
lenstra:~/src/qsort> free
             total       used       free     shared    buffers     cached
Mem:        255984       6596     249388          0        108       1116
-/+ buffers/cache:       5372     250612
Swap:       390592       5576     385016
lenstra:~/src/qsort> time ./qsbench -n 90000000 -p 1 -s 140175100
71.030u 7.040s 2:49.45 46.0%    0+0k 0+0io 22734pf+0w
lenstra:~/src/qsort> free
             total       used       free     shared    buffers     cached
Mem:        255984       8808     247176          0        108       1152
-/+ buffers/cache:       7548     248436
Swap:       390592       7948     382644
>What happens if you make the "vm_swap_full()" define in <linux/swap.h> be
>unconditionally defined to "1"?
lenstra:~/src/qsort> free
             total       used       free     shared    buffers     cached
Mem:        256000      16772     239228          0       1104       8008
-/+ buffers/cache:       7660     248340
Swap:       195512          0     195512
lenstra:~/src/qsort> time ./qsbench -n 90000000 -p 1 -s 140175100
70.530u 7.290s 2:33.26 50.7%    0+0k 0+0io 19689pf+0w
lenstra:~/src/qsort> free
             total       used       free     shared    buffers     cached
Mem:        256000       5132     250868          0        116       1144
-/+ buffers/cache:       3872     252128
Swap:       195512       3748     191764
..and now with 400M of swap:
lenstra:~/src/qsort> free
             total       used       free     shared    buffers     cached
Mem:        256000      13096     242904          0        504       4904
-/+ buffers/cache:       7688     248312
Swap:       390592          0     390592
lenstra:~/src/qsort> time ./qsbench -n 90000000 -p 1 -s 140175100
70.830u 7.100s 2:29.52 52.1%    0+0k 0+0io 18488pf+0w
lenstra:~/src/qsort> free
             total       used       free     shared    buffers     cached
Mem:        256000       4980     251020          0        108       1132
-/+ buffers/cache:       3740     252260
Swap:       390592       3840     386752
lenstra:~/src/qsort> time ./qsbench -n 90000000 -p 1 -s 140175100
70.560u 6.840s 2:28.66 52.0%    0+0k 0+0io 18203pf+0w
lenstra:~/src/qsort> free
             total       used       free     shared    buffers     cached
Mem:        256000       5044     250956          0        108       1112
-/+ buffers/cache:       3824     252176
Swap:       390592       3896     386696
Performace improved and numbers stabilized.
>That should make us be more aggressive
>about freeing those swap-cache pages, and it would be interesting to see
>if it also stabilizes your numbers.
>
>		Linus
I attach qsbench.c
--=====================_1004905067==_
Content-Type: text/plain; charset="iso-8859-1"
Content-Transfer-Encoding: quoted-printable
/*
 * Copyright (C) 2001 Lorenzo Allegrucci (lenstra@tiscalinet.it)
 * Licensed under the GPL
 */
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#define MAX_PROCS	1024
/**
 * quick_sort - Sort in the range [l, r]
 */
void quick_sort(int a[], int l, int r)
{
	int i, j, p, tmp;
	int m, min, max;
	i =3D l;
	j =3D r;
	m =3D (l + r) >> 1;
	if (a[m] >=3D a[l]) {
		max =3D a[m];
		min =3D a[l];
	} else {
		max =3D a[l];
		min =3D a[m];
	}
	if (a[r] >=3D max)
		p =3D max;
	else {
		if (a[r] >=3D min)
			p =3D a[r];
		else
			p =3D min;
	}
	do {
		while (a[i] < p)
			i++;
		while (p < a[j])
			j--;
		if (i <=3D j) {
			tmp =3D a[i];
			a[i] =3D a[j];
			a[j] =3D tmp;
			i++;
			j--;
		}
	} while (i <=3D j);
	if (l < j)
		quick_sort(a, l, j);
	if (i < r)
		quick_sort(a, i, r);
}
void do_qsort(int n, int s)
{
	int * a, i, errors =3D 0;
	if ((a =3D malloc(sizeof(int) * n)) =3D=3D NULL)=
 {
		perror("malloc");
		exit(1);
	}
	srand(s);
	//printf("seed =3D %d\n", s);
	for (i =3D 0; i < n; i++)
		a[i] =3D rand();
	quick_sort(a, 0, n - 1);
	//printf("verify... "); fflush(stdout);
	for (i =3D 0; i < n - 1; i++)
		if (a[i] > a[i + 1])
			errors++;
	//printf("done.\n");
	if (errors)
		fprintf(stderr, "WARNING: %d errors.\n",=
 errors);
	free(a);
	exit(0);
}
void start_procs(int n, int p, int s)
{
	int i, pid[MAX_PROCS];
	int status;
	if (p > MAX_PROCS)
		p =3D MAX_PROCS;
	for (i =3D 0; i < p; i++) {
		pid[i] =3D fork();
		if (pid[i] =3D=3D 0)
			do_qsort(n, s);
		else if (pid[i] < 0)
			perror("fork");
	}
	for (i =3D 0; i < p; i++)
		waitpid(pid[i], &status, 0);
}
void usage(void)
{
	fprintf(stderr, "Usage: qs [-h] [-n nr_elems] [-p nr_procs]"
			" [-s seed]\n");
	exit(1);
}
int main(int argc, char * argv[])
{
	char *n =3D "1000000", *p =3D "1", *s =3D "1";
	int nr_elems, nr_procs, seed;
	int c;
	if (argc =3D=3D 1)
		usage();
	while (1) {
		c =3D getopt(argc, argv, "hn:p:s:V");
		if (c =3D=3D -1)
			break;
		switch (c) {
		case 'h':
			usage();
		case 'n':
			n =3D optarg;
			break;
		case 'p':
			p =3D optarg;
			break;
		case 's':
			s =3D optarg;
			break;
		case 'V':
			printf("Version 0.93\n");
			return 1;
		case '?':
			return 1;
		}
	}
	nr_elems =3D atoi(n);
	nr_procs =3D atoi(p);
	seed =3D atoi(s);
	start_procs(nr_elems, nr_procs, seed);
	return 0;
}
--=====================_1004905067==_
Content-Type: text/plain; charset="us-ascii"
-- Lorenzo --=====================_1004905067==_--- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/