Hi all,

As the subject says, I've found a few lines like that in /var/log/messages:

[...]
/bsd: WARNING: mclpools limit reached; increase kern.maxclusters
[...]

The box is a 4.6 -STABLE with PF doing FW functions (moving 300/400Mbps) and always has worked like a charm.

I've noticed when these kind of message appears, the systems suffers little micro-dowtime in the network.

I've searched the mail archives and it's the expected behaviour: if you haven't any nmbcluster free, you haven't any mbuf and, because of that, network doesn't work temporaly. Henning explains here:
http://marc.info/?l=openbsd-misc&m=126745163232328&w=2

Moreover I've found the code:
http://www.openbsd.org/cgi-bin/cvsweb/src/sys/kern/uipc_mbuf.c

[...]
struct  pool mclpools[MCLPOOLS];

int     m_clpool(u_int);

int max_linkhdr;                /* largest link-level header */
int max_protohdr;               /* largest protocol header */
int max_hdr;                    /* largest link+protocol header */
int max_datalen;                /* MHLEN - max_hdr */

struct timeout m_cltick_tmo;
int     m_clticks;
void    m_cltick(void *);

void    m_extfree(struct mbuf *);
struct mbuf *m_copym0(struct mbuf *, int, int, int, int);
void    nmbclust_update(void);


const char *mclpool_warnmsg =
    "WARNING: mclpools limit reached; increase kern.maxclusters";

/*
 * Initialize the mbuf allocator.
 */
void
mbinit(void)
{
        int i;

        pool_init(&mbpool, MSIZE, 0, 0, 0, "mbpl", NULL);
        pool_setlowat(&mbpool, mblowat);

        for (i = 0; i < nitems(mclsizes); i++) {
                snprintf(mclnames[i], sizeof(mclnames[0]), "mcl%dk",
                    mclsizes[i] >> 10);
                pool_init(&mclpools[i], mclsizes[i], 0, 0, 0, mclnames[i],
                    NULL);
                pool_setlowat(&mclpools[i], mcllowat);
        }

        nmbclust_update();

        timeout_set(&m_cltick_tmo, m_cltick, NULL);
        m_cltick(NULL);
}

void
nmbclust_update(void)
{
        int i;
        /*
         * Set the hard limit on the mclpools to the number of
         * mbuf clusters the kernel is to support.  Log the limit
         * reached message max once a minute.
         */
        for (i = 0; i < nitems(mclsizes); i++) {
                (void)pool_sethardlimit(&mclpools[i], nmbclust,
                    mclpool_warnmsg, 60);
        }
        pool_sethiwat(&mbpool, nmbclust);
}

[...]

When you reach the mbuf cluster available, nmbclust_update() inserts the mclpool_warnmsg string in /var/log/message.

That's fine and clear. The problem here is:

?why a system that normally uses (according symon graphs) 80/120 mbuf clusters needs 8/10K nmbcluster sometimes?

At present I've done a simple workaround:

# cat /etc/sysctl.conf | grep -i cluster

kern.maxclusters=16384

but I wonder the real reasons for this nmbcluster increment.

?How can I debug it?

Thanks.

--
I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. And when it has gone past I will turn the inner eye to see its path. Where the fear has gone there will be nothing. Only I will remain.

Bene Gesserit Litany Against Fear.

--
I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. And when it has gone past I will turn the inner eye to see its path. Where the fear has gone there will be nothing. Only I will remain.

Bene Gesserit Litany Against Fear.

Reply via email to