Memory leak or misunderstanding - rlm_perl?

Mihail Vasiliev mick at linkintel.ru
Wed Oct 7 19:58:33 CEST 2009


Hello, all.

I am running freeradius-2.1.6 with all AAA logick hidden in perl module,
thus using rlm_perl.

Having about 1000-10000 client connections per day radiusd consumes about
1Gb of memory per day (I restart it daily).

The only (possibly) important thing - I am using several external modules
in my main perl module.

I can supply code of perl modules, if necessary.

radiusd config (with stripped off comments):


prefix = /usr/local
exec_prefix = /usr/local
sysconfdir = /usr/local/etc
localstatedir = /var
sbindir = /usr/sbin
logdir = ${localstatedir}/log/radius
raddbdir = ${sysconfdir}/raddb
radacctdir = ${logdir}/radacct
confdir = ${raddbdir}
run_dir = ${localstatedir}/run/radiusd
db_dir = ${localstatedir}/lib/radiusd
log_file = ${logdir}/radius.log
libdir = /usr/local/lib
pidfile = ${run_dir}/radiusd.pid
user = radiusd
group = radiusd
max_request_time = 30
delete_blocked_requests = no
cleanup_delay = 5
max_requests = 1024
listen {
        ipaddr = me.radius
        port = 1645
        type = auth
}
listen {
        ipaddr = me.radius
        port = 1646
        type = acct
}


log {
        destination = files
        file = ${logdir}/radius.log
        syslog_facility = daemon
        stripped_names = no
        auth = no
        auth_badpass = no
        auth_goodpass = no
}


hostname_lookups = no

allow_core_dumps = yes

regular_expressions     = yes
extended_expressions    = yes

log_stripped_names = no

log_auth = yes

log_auth_badpass = yes
log_auth_goodpass = yes

usercollide = no

lower_user = no
lower_pass = no

nospace_user = no
nospace_pass = no

checkrad = ${sbindir}/checkrad

security {
        max_attributes = 200
        reject_delay = 1
        status_server = no
}

proxy_requests  = yes
$INCLUDE  ${confdir}/proxy.conf
$INCLUDE  ${confdir}/clients.conf
snmp    = no
$INCLUDE  ${confdir}/snmp.conf
thread pool {
        start_servers = 5
        max_servers = 32
        min_spare_servers = 3
        max_spare_servers = 10
        max_requests_per_server = 300
}

modules {
        chap {
                authtype = CHAP
        }
        unix {
                cache = no
                shadow = /etc/shadow
        }
        mschap {
                use_mppe = no
        }
        realm suffix {
        }
        preprocess {
        }
        files {
                usersfile = ${confdir}/users
                acctusersfile = ${confdir}/acct_users
                preproxy_usersfile = ${confdir}/preproxy_users
                compat = no
        }

        detail {
                detailfile = ${radacctdir}/%{Client-IP-Address}/detail-%Y%m%d

                detailperm = 0600
        }

        detail auth_log {
                detailfile =
${radacctdir}/%{Client-IP-Address}/auth-detail-%Y%m%d

                detailperm = 0600
        }

        detail reply_log {
                detailfile =
${radacctdir}/%{Client-IP-Address}/reply-detail-%Y%m%d

                detailperm = 0600
        }

        acct_unique {
                key = "User-Name, Acct-Session-Id, NAS-IP-Address,
Client-IP-Address, NAS-Port"
        }

        radutmp {
                filename = ${logdir}/radutmp
                username = %{User-Name}
                case_sensitive = yes
                check_with_nas = yes
                perm = 0600
                callerid = "yes"
        }

        radutmp sradutmp {
                filename = ${logdir}/sradutmp
                perm = 0644
                callerid = "no"
        }

        attr_filter {
                attrsfile = ${confdir}/attrs
        }

        counter daily {
                filename = ${db_dir}/db.daily
                key = User-Name
                count-attribute = Acct-Session-Time
                reset = daily
                counter-name = Daily-Session-Time
                check-name = Max-Daily-Session
                allowed-servicetype = Framed-User
                cache-size = 5000
        }

        always fail {
                rcode = fail
        }
        always reject {
                rcode = reject
        }
        always ok {
                rcode = ok
                simulcount = 0
                mpp = no
        }

        expr {
        }

        digest {
        }

        exec {
                wait = yes
                input_pairs = request
        }

       perl {
               module = /etc/raddb/esdfreeradius.pm
               func_authenticate = esd_authenticate
               func_authorize = esd_authorize
               func_preacct = esd_preacct
               func_accounting = esd_accounting
               func_checksimul = esd_checksimul
               func_post_auth = esd_post_auth
               func_detach = esd_detach
       }

        exec echo {
                wait = yes
                program = "/bin/echo %{User-Name}"
                input_pairs = request
                output_pairs = reply
        }

        ippool main_pool {
                range-start = 10.0.1.1
                range-stop = 10.0.254.254
                netmask = 255.255.255.255
                cache-size = 800
                session-db = ${db_dir}/db.ippool
                ip-index = ${db_dir}/db.ipindex
                override = no
                maximum-timeout = 0
        }
}

instantiate {
        exec
        expr
}

authorize {
        preprocess
        perl
        chap
        suffix
}



authenticate {
        Auth-Type CHAP {
                chap
        }

        Auth-Type perl {
                perl
        }
}


preacct {
        preprocess
        acct_unique
}

accounting {
        perl
}


session {
        perl
}


post-auth {
}

pre-proxy {
}

post-proxy {
}




More information about the Freeradius-Users mailing list