6.2 -> 7.0 now mlock(2) fails

Dieter freebsd at sopwith.solgatos.com
Sat Apr 12 20:52:41 UTC 2008


> > I never saw mlock(2) fail in 6.2 but with 7.0 I sometimes
> > get mlock(2) failed: Resource temporarily unavailable.
> 
> That's error EAGAIN:
> 
>      [EAGAIN]           Locking the indicated range would exceed
>                         either the system or per-process limit
>                         for locked memory.
> 
> You are hitting either the `vm.max_wired' limit, or the per-process
> RLIMIT_MEMLOCK limit.
> 
> > What changed and how do I fix it?
> 
> It would be nice if you could run a test program that prints the value of
> vm.max_wired and RLIMIT_MEMLOCK on 6.2 and then on 7.0.  As an extra test,
> it may be worth printing these values in the log of your application when
> mlock(2) fails.

vm.max_wired looks like a sysctl, but sysctl doesn't know about it.

sysctl: unknown oid 'vm.max_wired'

sysctl -a | grep -i wire | grep -vi firewire 
vm.stats.vm.v_wire_count: 89046

/usr/include/sys/resource.h:#define     RLIMIT_MEMLOCK  6               /* locked-in-memory address space */

It doesn't always fail, just sometimes.  It is trying to lock 172490752 bytes.
There can be two processes wanting to do this at once.  Seems to be the 2nd
one that sometimes fails.

with one process:
vm.stats.vm.v_wire_count: 130992  (41946 more)

with two processes (mlock failed):
vm.stats.vm.v_wire_count: 131047  (55 more)

killed both proceses:
vm.stats.vm.v_wire_count: 88788


More information about the freebsd-questions mailing list