Hello,

I too had problems with running out of shared mem segments, so I wrote
my first ever perl script that does something useful for me. I've
attached it to this email and I'll paste it in below too, for
convenience.

I noticed that many (most?) of the shared mem segments in use, when I
was running out of them, didn't actually have any processes attached to
them. This perl script just goes through, finds those non-attached
shared mem segments, and deletes them. I've found running it
periodically works great for me, you may even want to put it in your
crontab and let it run once a day, just as a little proactive
housekeeping.

For the record, here are the kernel options I use with this kernel:

options         SYSVSHM                 #SYSV-style shared memory
options         SYSVMSG                 #SYSV-style message queues
options         SYSVSEM                 #SYSV-style semaphores
options         SHMALL=16384
options         SHMMAX="(SHMMAXPGS*PAGE_SIZE+1)"
options         SHMMAXPGS=8192
options         SHMMIN=128
options         SHMMNI=128
options         SHMSEG=96

I think that last one makes the biggest difference, and is the one you
may want to make as large as possible, though 96 works fine for my 64MB
of ram. This is a 4.0-release kernel, and I use XFree86 4.0 with
Enlightenment as my window manager.

John Toon wrote:
> 
> Clive Lin wrote:
> >
> > Hm... long time ago I asked google about those SHM* and
> > I thought SHMSEG may be the key point. Because SHMSEG stands for
> > maximum number of shared segments per process.
> 
> Fantastic! You're absolutely correct. Everything is now working
> perfectly. My mistake had been to think that the system was running out
> of actual shared memory pages, but successive increases of the maximum
> pages had no effect. The actual problem, as you've rightly pointed out,
> was that each process was running out of shared memory segments...
> 
> > About the SYSV options, I have small notes about them. Though, I couldn't
> > make sure they are 100% correct. It just works, and I have no more interests
> > to dig more :->
> >
> > SHMALL max shared mem system wide (in pages).
> > SHMMAX max shared memory segment size (bytes).
> > SHMMIN min shared memory segment size (bytes).
> > SHMMNI max num of shared segments system wide.
> > SHMSEG maximum number of shared segments per process.
> >
> > Regards,
> > Clive
> 
> Just as a side note, are there any commands available that will inform
> me how many shared memory pages are currently being used by the running
> system?

yes, ipcs and ipcrm are the ones my perl script uses. Check out the
manpage for each of them. . .  I like to run "ipcs -mbop" to get a lot
of info about used shared mem segments.

-Lance

Okay, here's my shmfree script, make sure you set the executable bit. I
keep it in ~/bin . . .

#!/usr/bin/perl -w

$lines=0;
$ignored=0;
$deleted=0;

# IPCS is used to display info about SYSV IPC memory stuff. See ipcs(1)
open INPUT, "ipcs -mbop | grep $ENV{USER} |";

while( <INPUT> ) {
        $lines++;
        @output = split;
        print "a shmid is $output[1], ";
        print "nattach is $output[6]";
        if ($output[6] == 0) {
                system 'ipcrm', '-m', $output[1]; # See ipcrm(1)
                $deleted++;
                print "  <--- Deleted\n";
        } else {
                print "\n";
                $ignored++;
        }

}
print "Total shared mem segments: $lines, ignored: $ignored, deleted:
$deleted\n";
#!/usr/bin/perl -w

$lines=0;
$ignored=0;
$deleted=0;

# IPCS is used to display info about SYSV IPC memory stuff. See ipcs(1)
open INPUT, "ipcs -mbop | grep $ENV{USER} |";

while( <INPUT> ) {
        $lines++;
        @output = split;
        print "a shmid is $output[1], ";
        print "nattach is $output[6]";
        if ($output[6] == 0) {
                system 'ipcrm', '-m', $output[1]; # See ipcrm(1)
                $deleted++;
                print "  <--- Deleted\n";
        } else {
                print "\n";
                $ignored++;
        }

}
print "Total shared mem segments: $lines, ignored: $ignored, deleted: $deleted\n";

Reply via email to