rlm_python and threading

Andrew Parisio parisioa at gmail.com
Wed Mar 25 03:27:30 CET 2015

I'm working with rlm_python in FreeRadius 2.2.6 and with 20 simultaneous
eapol_test threads running I was only getting 5-6 requests/second.  This
got me wondering how FreeRadius and rlm_python handle threading.   So to
make sure it wasn't related to my database calls or anything else I wrote a
simple radiusd_module.py with no external dependencies/calls that instantly
returned OK and it was handling 275 requests/second.

Now I'm doubting my requests are being processed in parallel so I modified
my radiusd_module.py to have a 1 second sleep between starting to process a
request and returning OK.   The module looks something like this:

  import radiusd
  import time

  def instantiate(p):
      # do something
      return 0

  def array_to_dict(array):
      my_dict = {}
      for t in array:
          # strip any quotes off of the beginning & end
          my_dict[t[0]] = t[1].lstrip('"').rstrip('"')
      return my_dict

  def post_auth(p):
      my_dict = array_to_dict(p)
      print "***** Start %s" % my_dict['NAS-Port-Id']
      print "***** End %s" % my_dict['NAS-Port-Id']
      return radiusd.RLM_MODULE_OK

Then I set two copies of eapol_test in an infinite loop sending
NAS-Port-Id's of 1 and 2 so I could see what radius.log looked like.

The hypothesis being if it's properly threaded I should get this:
***** Start 1
***** Start 2
==== Pause 1 second
***** End 1
***** End 2
... repeat

I ran the the two eapol_test threads against radius and the output looks
like this:
tail radius.log -f | grep "\*\*\*\*\*"
***** Start 1
==== Pause 1 second <-- not output, just a literal 1 second wait from
***** End 1
***** Start 2
==== Pause 1 second <-- not output, just a literal 1 second wait from
***** End 2
.... and so on,

>From this I can see that requests handled by rlm_python are being served by
a single thread rather than multiple/parallel threads.  Does anybody have
any experience with rlm_python.py and/or know what I might be doing wrong?



P.S. Latency from my development machine at my desk to Dynamodb in AWS is
~80ms, **which won't be the case for prod**, which is why I was only
getting 5-6 requests/second.  but I'd still like to be able to handle
hundreds of requests/s per production host (obviously the hosts will need
to be sized appropriately).

More information about the Freeradius-Users mailing list