This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Next revision Both sides next revision | ||
devel:config-engines [2016/04/19 15:42] miconda [Python Config KEMI Engine] |
devel:config-engines [2016/05/03 13:55] miconda [Interpreters Performances] |
||
---|---|---|---|
Line 381: | Line 381: | ||
return 1; | return 1; | ||
</ | </ | ||
+ | |||
+ | ===== Examples ===== | ||
+ | |||
+ | Some examples of configuration files using the native, Lua or Python interpreter are available in Kamailio source tree inside the **examples/ | ||
+ | |||
+ | * https:// | ||
+ | |||
+ | The configuration file to start with is **kamailio-basic-kemi.cfg**: | ||
+ | |||
+ | * https:// | ||
+ | |||
+ | You can either rename it to kamailio.cfg or use **-f** command line option to point to it. | ||
+ | |||
+ | If started without any change and no define in command line, then Kamailio will continue to load the routing blocks in the native language, stored in the file **kamailio-basic-kemi-native.cfg**: | ||
+ | |||
+ | * https:// | ||
+ | |||
+ | If you define WITH_CFGLUA inside **kamailio-basic-kemi.cfg** or provide the command line parameter **-A WITH_CFGLUA**, | ||
+ | |||
+ | * https:// | ||
+ | |||
+ | |||
+ | If you define WITH_CFGPYTHON inside **kamailio-basic-kemi.cfg** or provide the command line parameter **-A WITH_CFGPYTHON**, | ||
+ | |||
+ | * https:// | ||
+ | |||
+ | Combining **kamailio-basic-kemi.cfg** with **kamailio-basic-kemi-native.cfg** results more or less in the **kamailio-basic.cfg** from the **etc/** folder in Kamailio source tree. The Lua and Python scripts are offering the same features, but written in another language. | ||
+ | |||
+ | Note that you need to copy these files at the location of the configuration file for your Kamailio configuration and eventually adjust the paths to them inside **kamailio-basic-kemi.cfg**. | ||
+ | |||
+ | Let's say you installed from sources, the config files are located inside the **/ | ||
+ | |||
+ | Then you can start Kamailio with native routing blocks: | ||
+ | |||
+ | <code c> | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | To start it with Lua routing blocks: | ||
+ | |||
+ | <code c> | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | To start it with Python routing blocks: | ||
+ | |||
+ | <code c> | ||
+ | / | ||
+ | </ | ||
+ | |||
+ | If you want to print the log messages to the terminal, add the extra parameters **-E -e -ddd** - this will print up to debug level which can be too verbose. Using up to info level can be better, use the extra parameters | ||
+ | |||
+ | When you have at least log level info, with kamailio-basic-kemi.cfg you will notice that a log message is printed showing the duration in microseconds of executing the main routing blocks, no matter they were in native language, Lua or Python. If the logs were printed to the terminal, they look like: | ||
+ | |||
+ | < | ||
+ | LUA {REGISTER}: 13(28737) INFO: < | ||
+ | </ | ||
+ | |||
+ | Depending on the scripting language used for routing blocks, the log messages start with: | ||
+ | |||
+ | * NAT - for native interpreter | ||
+ | * LUA - for LUA | ||
+ | * PYT - for Python | ||
+ | |||
+ | Again, these are specific to the config options in the kamailio-basic-kemi.cfg file -- look for log_prefix inside it for more details. | ||
+ | |||
+ | ==== Interpreters Performances ==== | ||
+ | |||
+ | Relaying on the log messages that print the execution time for main routing blocks handling the SIP requests and responses, some statistics were gathered to see how the execution time compares for each of the interpreters. | ||
+ | |||
+ | The tests were not targeting to measure the capacity of Kamailio, but the impact of using different interpreters for same kind of features. | ||
+ | |||
+ | The system used for testing was a VirtualBox with 2GB or RAM and 2 processors, having Linux Mint as guest OS. The host was a MAC OS X running on a Mid 2012 model of Macbook Pro. | ||
+ | |||
+ | Testing was done for registrations with user authentication, | ||
+ | |||
+ | The values are in micro-seconds (1 / 1 000 000 of a second) and represents the average execution time, the minimum execution time and the maximum execution time for request_route{...} block (or the equivalent of). | ||
+ | |||
+ | The results were: | ||
+ | |||
+ | < | ||
+ | INTERPRETER - AVERAGE - MIN - MAX | ||
+ | |||
+ | NATIVE | ||
+ | |||
+ | LUA - 308.32 | ||
+ | |||
+ | PYTHON | ||
+ | |||
+ | </ | ||
+ | |||
+ | Remarks: | ||
+ | |||
+ | * the average was between 300 and 400 micro-seconds, | ||
+ | * the test was run many times, the Native and Lua execution were close to each other, many times Lua being faster, but again, at small difference | ||
+ | * no big surprise as Lua is calling directly the C bindings and its interpreter is written also in C. With the config used in the tests, the Lua script doesn' | ||
+ | * Python is slower comparing to Native and Lua, but not that much as one may expect. It can still deal with 2500 REGISTERs/ | ||
+ | * in some tests, the maximum execution time was between 5000 and 10000 micro-second, | ||
===== To-Do ===== | ===== To-Do ===== | ||
- | * see if same dynamic object mechanism can be implemented for Perl, Python, etc. | + | * see if same dynamic object mechanism can be implemented for Perl, Mono, Java, etc. |
* discuss and decide the way to generate documentation of available functions via KEMI | * discuss and decide the way to generate documentation of available functions via KEMI | ||
* analyze if worth using a declarative language for specifying the exported functions and then generate necessary C code from them (could be useful for generating docs as well) | * analyze if worth using a declarative language for specifying the exported functions and then generate necessary C code from them (could be useful for generating docs as well) | ||
- | * optimize the indexing of exported functions (now indexed by module name, then walk through the exported list of functions) |