Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Swap Usage

4 views
Skip to first unread message

Doug Hardie

unread,
Jul 29, 2015, 8:42:06 PM7/29/15
to
I have several FreeBSD 9.3 systems that are using swap and I can’t figure out what is doing it. The key system has 6GB swap and currently it has over 2GB in use. ps shows only a kernel module [intr] with a W status. Obviously that isn’t using the space. No other process shows a W in its status. I suspect this is somewhat related to the use of mmap in one application. However, all of the mmaps in that application are file backed and thus shouldn’t use swap. How do I figure out what that swap space is being used for?


_______________________________________________
freebsd...@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-stable
To unsubscribe, send any mail to "freebsd-stabl...@freebsd.org"

Chris H

unread,
Jul 29, 2015, 9:58:20 PM7/29/15
to
On Wed, 29 Jul 2015 17:41:33 -0700 Doug Hardie <bc...@lafn.org> wrote

> I have several FreeBSD 9.3 systems that are using swap and I can’t figure
> out what is doing it. The key system has 6GB swap and currently it has over
> 2GB in use. ps shows only a kernel module [intr] with a W status. Obviously
> that isn’t using the space. No other process shows a W in its status. I
> suspect this is somewhat related to the use of mmap in one application.
> However, all of the mmaps in that application are file backed and thus
> shouldn’t use swap. How do I figure out what that swap space is being used
> for?

Maybe top(1)?
top -P
for example. At least you could see who's chewing all your memory. Which
should be a good clue as to who's responsible for swap usage.

--Chris

Doug Hardie

unread,
Jul 30, 2015, 1:00:49 AM7/30/15
to

> On 29 July 2015, at 18:57, Chris H <bsd-...@bsdforge.com> wrote:
>
> On Wed, 29 Jul 2015 17:41:33 -0700 Doug Hardie <bc...@lafn.org> wrote
>
>> I have several FreeBSD 9.3 systems that are using swap and I can’t figure
>> out what is doing it. The key system has 6GB swap and currently it has over
>> 2GB in use. ps shows only a kernel module [intr] with a W status. Obviously
>> that isn’t using the space. No other process shows a W in its status. I
>> suspect this is somewhat related to the use of mmap in one application.
>> However, all of the mmaps in that application are file backed and thus
>> shouldn’t use swap. How do I figure out what that swap space is being used
>> for?
> Maybe top(1)?
> top -P
> for example. At least you could see who's chewing all your memory. Which
> should be a good clue as to who's responsible for swap usage.

UFS although I don’t see how that could make a difference. Swap doesn’t use a regular file system. However, the kernel must track the actual usage using something like a simple file system. There must be a way to investigate it.

Top doesn’t show anything unusual. The most VM used is by the process that uses a lot of mmap space that is all file backed. If it was another process that was partially swapped then the ps status should show a W. Only the one does.

Doug Hardie

unread,
Jul 30, 2015, 2:12:07 AM7/30/15
to

> On 29 July 2015, at 17:41, Doug Hardie <bc...@lafn.org> wrote:
>
> I have several FreeBSD 9.3 systems that are using swap and I can’t figure out what is doing it. The key system has 6GB swap and currently it has over 2GB in use. ps shows only a kernel module [intr] with a W status. Obviously that isn’t using the space. No other process shows a W in its status. I suspect this is somewhat related to the use of mmap in one application. However, all of the mmaps in that application are file backed and thus shouldn’t use swap. How do I figure out what that swap space is being used for?

UFS although that shouldn’t matter. Swap does not use a file system. If it did, it would be easy to figure out.

Top doesn’t show much.

Peter Jeremy

unread,
Jul 30, 2015, 2:51:32 AM7/30/15
to
[reformatted]

On 2015-Jul-29 17:41:33 -0700, Doug Hardie <bc...@lafn.org> wrote:
>I have several FreeBSD 9.3 systems that are using swap and I can’t
>figure out what is doing it. The key system has 6GB swap and
>currently it has over 2GB in use.

Is the system currently paging (top(1) and "systat -v" will show
this)? If not, this just means that at some time in the past, the
system was under memory pressure and paged some process memory out.
Since then, that memory hasn't been touched so the system hasn't paged
it in.

>ps shows only a kernel module
>[intr] with a W status.

'W' means the whole process is 'swapped' out - this will only occur
under severe RAM pressure. Normally, the system will just page out
inactive parts of a processes address space - and none of the ps flags
will show this.

> How do I figure out what that swap space is being used for?

I don't think this can be trivially done. "procstat -v" will show
the number of resident pages within each swap-backed region, any
pages in that region that have been touched but are not resident
are on the swap device but any pages that have never been touched
aren't counted at all.

--
Peter Jeremy

Doug Hardie

unread,
Jul 30, 2015, 4:39:41 AM7/30/15
to

Bingo. procstat shows the problem. The process that I suspected has a large number of entries like:

650 0x834c00000 0x835800000 rw- 0 0 1 0 ---- sw
650 0x835800000 0x835c00000 rw- 0 0 1 0 ---- sw
650 0x835c00000 0x837c00000 rw- 1 0 1 0 ---- sw

I don’t know whats in those areas yet. If I were to kill the process with SIGABRT would the core dump show those areas? I might be able to figure out what they are from that.

Thanks for the pointer.

Doug Hardie

unread,
Aug 5, 2015, 10:19:17 PM8/5/15
to

I believe I have found a bug in FreeBSD 9.3 mmap. The following test program (named test.c) does an mmap to itself and monitors the memory objects created with procstat. After the mmap, munamp is called and the objects are checked again. The objects created from the mmap do not get purged, but remain. Eventually, after enough have been created, they start becoming type sw and eventually the system runs out of swap.

The output:
zool# ./test
31459 0x8049000 0x804a000 rw- 1 0 1 0 CN-- df
31459 0x2805f000 0x28069000 rw- 10 0 1 0 C--- df
31459 0x28186000 0x281ad000 rw- 13 0 1 0 CN-- df
31459 0xbfbdf000 0xbfbff000 rwx 3 0 1 0 C--D df
----------------------------------
31459 0x8049000 0x804a000 rw- 1 0 1 0 CN-- df
31459 0x804a000 0x8400000 rw- 1 0 1 0 CN-- df
31459 0x2805f000 0x28069000 rw- 10 0 1 0 CN-- df
31459 0x28186000 0x281ad000 rw- 14 0 1 0 CN-- df
31459 0x28400000 0x28800000 rw- 6 0 1 0 CN-- df
31459 0xbfbdf000 0xbfbff000 rwx 3 0 1 0 C--D df
----------------------------------
31459 0x8049000 0x804a000 rw- 1 0 1 0 CN-- df
31459 0x804a000 0x8400000 rw- 1 0 1 0 CN-- df
31459 0x2805f000 0x28069000 rw- 10 0 1 0 CN-- df
31459 0x28186000 0x281ad000 rw- 14 0 1 0 CN-- df
31459 0x28400000 0x28800000 rw- 6 0 1 0 CN-- df
31459 0xbfbdf000 0xbfbff000 rwx 3 0 1 0 C--D df
----------------------------------
31459 0x8049000 0x804a000 rw- 1 0 1 0 CN-- df
31459 0x804a000 0x8400000 rw- 1 0 1 0 CN-- df
31459 0x2805f000 0x28069000 rw- 10 0 1 0 CN-- df
31459 0x28186000 0x281ad000 rw- 14 0 1 0 CN-- df
31459 0x28400000 0x28800000 rw- 6 0 1 0 CN-- df
31459 0xbfbdf000 0xbfbff000 rwx 3 0 1 0 C--D df

The program:
int main (int argc, char *argv[])
{
int rc, pid, fd;
char *cp;
char cmd[1024];


pid = getpid ();
sprintf (cmd, "procstat -v %d | grep df", pid);
fflush (stdout);
rc = system (cmd);
fflush (stdout);
printf ("----------------------------------\n");

fd = open ("./test.c", O_RDWR);
cp = mmap (0, 100, PROT_READ|PROT_WRITE, MAP_FILE, fd, 0);
if (cp == MAP_FAILED)
{
printf ("mmap error %s\n", strerror(errno));
exit (1);
}

fflush (stdout);
rc = system (cmd);
fflush (stdout);
printf ("----------------------------------\n");

rc = munmap (cp, 100);
if (rc == -1)
{
printf ("munmap error %s\n", strerror(errno));
exit (1);
}


fflush (stdout);
rc = system (cmd);
fflush (stdout);
printf ("----------------------------------\n");

close (fd);

fflush (stdout);
rc = system (cmd);
fflush (stdout);

Doug Hardie

unread,
Aug 6, 2015, 11:24:48 PM8/6/15
to
Some more testing indicates that the problem is most likely in close, not mmap. I modified the program to the following:

zool# more test.c
#include <stdio.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>
#include <errno.h>
#include <sys/mman.h>


int main (int argc, char *argv[])
{
int rc, pid, fd;
char *cp;
char cmd[1024];


pid = getpid ();
sprintf (cmd, "procstat -v %d | grep df", pid);
fflush (stdout);
rc = system (cmd);
fflush (stdout);
printf ("----------------------------------\n");

fd = open ("./test.c", O_RDWR);

fflush (stdout);
rc = system (cmd);
fflush (stdout);
printf ("----------------------------------\n");

close (fd);

fflush (stdout);
rc = system (cmd);
fflush (stdout);
}

The output is:

zool# ./test
85860 0x8049000 0x804a000 rw- 1 0 1 0 CN-- df
85860 0x2805f000 0x28069000 rw- 10 0 1 0 C--- df
85860 0x28186000 0x281ad000 rw- 13 0 1 0 CN-- df
85860 0xbfbdf000 0xbfbff000 rwx 3 0 1 0 C--D df
----------------------------------
85860 0x8049000 0x804a000 rw- 1 0 1 0 CN-- df
85860 0x804a000 0x8400000 rw- 1 0 1 0 CN-- df
85860 0x2805f000 0x28069000 rw- 10 0 1 0 CN-- df
85860 0x28186000 0x281ad000 rw- 14 0 1 0 CN-- df
85860 0x28400000 0x28800000 rw- 6 0 1 0 CN-- df
85860 0xbfbdf000 0xbfbff000 rwx 3 0 1 0 C--D df
----------------------------------
85860 0x8049000 0x804a000 rw- 1 0 1 0 CN-- df
85860 0x804a000 0x8400000 rw- 1 0 1 0 CN-- df
85860 0x2805f000 0x28069000 rw- 10 0 1 0 CN-- df
85860 0x28186000 0x281ad000 rw- 14 0 1 0 CN-- df
85860 0x28400000 0x28800000 rw- 6 0 1 0 CN-- df
85860 0xbfbdf000 0xbfbff000 rwx 3 0 1 0 C--D df


Open creates 2 memory allocations, one in low memory and one in high. Close does not remove them. Somewhere in the source I found a note that said that close on files didn’t require any action. However, those two memory allocations do need to get freed.

0 new messages