On Apr 24, 2008 at 02:33, William Zhang <[EMAIL PROTECTED]> wrote:
> Hi Andrei,
>
> Thank you very much for the information and detail explanation!
>
> The project requirement is to reduce the total code and data memory
> for SER and necessary modules(I listed in my previous message) to 1MB
> or less. I am working on SER 0.9.6 and I removed the the TCP, IPV6 and
> UDP MULTICAST define and manually remove the unixsocket support in the
> core and modules that use it. With -Os and debug strip, I am getting
> 233.7KB for core and 225KB for my modules.
That's great!
> But base on your
> compilation result on mipsel, I probably need to take consider a code
> size increase of 40% when build for MIPS system.
Hopefully that had a lot to do with the compiler.
>
> By removing the unixsocket modules, I saved 128KB for the socket
> buffer. And I slashed the pool memory to 64KB, and reduced the tm hash
> table from 64K entry to 1K entry( 24 bytes each entry so use only 24KB
> in total now) so I can reduced the shared memory to 192KB, basically
> 168KB for any other shared memory usage. (What the tm hash table used
> for? Is 1024 entries too less?)
The tm hash table is used to store and quickly find a transaction.
A call involves at least 2 transactions: one for the original INVITE
and one for the BYE. So if you are aiming for 1cps that means at most 2
transactions/s. However transactions are kept in memory another 5 s
after the completion (to catch retransmissions) so at a 1 cps constant
rate => you could have 10 transaction in memory in ideal conditions (in
non ideal conditions, like call attempts with nobody answering =>
invite transaction timeout 120s + 5s => maximum 625 transaction in
memory in the same time). So you could go much lower then 1024 (in
theory, in practice we haven't checked if the hash function
distribution is still good with very low hash table sizes). If you
don't care about DOS or corner cases (like having only unanswered
calls) you'll have less then 50 transaction in memory at any time =>
you could even try a hast table with only 1 entry. The worst
thing that could happen is to have very high cpu usage (if this happens
try to increase the hash table).
I'm a little worried about the pool memory. 64Kb seems a little to less
to me. I don't think there would be a problem if you use a higher
number. The unused part should not be paged-in by the OS so the
effective used memory should not greater if you use a larger pkg_mem
pool size. For example, if I start ser 2.1 with a basic stateless
forwarding config, it uses only 556Kb of memory (RSS in top or ps axl)
although it is configured with 4Mb pool size and started with 2 Mb
shared memory.
So by limiting the POOL size or the shared memory size, you are in fact
limiting the maximum ser memory usage. If ser doesn't need the whole
memory it won't access it and the memory will still be free for other
programs.
> This way I end up consume less than
> 1MB code and data size. I can run a few calls successfully. I have
> not run any significant load yet but based on your comment, I
> definitely can not support 1cps and I have to either reduce cps or
> increase the memory. You mentioned 1 cps with default timeouts you
> need ~200k. What does the timeout do with the memory? Is it from the
> memory pool or shared memory?
It's from the shared memory. The non-shared memory (memory pool) it's
used either on startup/init. or for temporary stuff.
The timeouts influences how much a transaction will be kept in memory.
For example even if a transaction is complete it still has to be kept in
memory for 5s to catch possible delayed retransmissions (according to
the rfc). It's worse if you are trying to call somebody who doesn't
answer. In this case the timeout is 120s by default in ser (IIRC in the
rfc is 180s).
You could save some memory also by changing some of the tm timeouts.
In general if you have a simple setup with low probability of delayed
retransmissions (e.g. local net.) you can decrease the final wait timer to 1s
without problems ( in ser.cfg modparam("tm", "wt_timer" ,1)).
You could also tune the no-response timeouts (e.g. fr_timer set to 10s
instead of the default 30 and fr_inv_timer to 90s instead of 120s).
Could you make a list with all the changes you've made? I think it would
be very usefull for anynone trying to run ser on some embedded system
and we could even add and emebedded option in the makefile that would
automatically build a low memory optimized ser version.
Andrei
>
> Thanks,
> William
>
> On Wed, Apr 23, 2008 at 5:49 AM, Andrei Pelinescu-Onciul
> <[EMAIL PROTECTED]> wrote:
> > On Apr 20, 2008 at 20:04, William Zhang <[EMAIL PROTECTED]> wrote:
> > > Hi All,
> > >
> > > I am a newbie to the SIP Express Router and the project I am currently
> > > working on requires me to port SER to a MIPS embedded system with
> > > limited memory space. So the code size and data memory size are my
> > > primary concerns.
> >
> > ser already works and compiles for MIPS, so you'll need only to optimize
> > it for lower memory usage.
> >
> > Example cross-compile for openwrt (gcc 3.4.4):
> >
> > make ARCH=mips2 CC=${OPENWRT}/staging_dir_mipsel/bin/mipsel-linux-gcc \
> > OS=linux OSREL=2.4.35 CC_EXTRA_OPTS=-Os extra_defs=-DNO_DEBUG
> >
> > After runing strip on it:
> > ls -l ser
> > -rwxr-xr-x 1 andrei andrei 526652 Apr 23 14:10 ser
> >
> > On x86, compiling with similar options, gcc 4.2.3 and stripping, I get:
> > -rwxr-xr-x 1 andrei andrei 379876 Apr 23 14:25 ser
> >
> >
> > (for ser 0.9.7, 2.0 & 2.1 are ~ 1Mb for mipsel/gcc 3.4.4 and ~640k
> > x86/gcc 4.2.3)
> >
> >
> >
> > > Since I am still having some issue with my MIPS cross compilation, I
> > > just worked the SER 0.9.6 on my SUSE PC. With all the default compiler
> > > option but removing the debug info (without the -g option) and i386
> > > release target, the SER
> > > is about 490KB in code size (the .text section in the map file). I
> > > disabled the TCP, IPV6 and UDP MULTICAST support, the code size
> > > decreased to 423KB. The SER website mentions that footprint size:
> > > 300k core, all common modules
> > > (optional) up to 630k (http://www.iptel.org/ser). Am I missing
> > > something here or maybe the website is not up to date with the
> > > footprint?
> >
> > It's not up to date (IIRC this was ser 0.8.10).
> >
> >
> > > I only need the basic SER with authentication and PSNT
> > > gateway support. I loaded these moduels:
> > > mysql.so, sl.so, tm.so, rr.so, maxfwd.so, usrloc.so, registrar.so,
> > > auth.so, auth_db.so, uri.so, uri_db.so, domain.so, avpops.so and
> > > permissions.so. And these modules adds up to 432KB with tm.so as the
> > > biggest one(200KB). Is there any
> > > way to further reduce code size for the core and modules?
> >
> > Compile with -Os (CC_EXTRA_OPTS=-Os to the make command line),
> > extra_defs=-DNO_DEBUG.
> > There are lots of othe different defines you can play with (like turning
> > down support for poll methods you don't use), but I don't remember all
> > of them.
> >
> > >
> > > Of course, this is only the size for PC platform. I am hoping the MIPS
> > > should not differ too much. If anybody compile SER in MIPS, could you
> > > let me know what the code size is? Even for IPAQ compile result, I
> > > also would like to know it.
> >
> > It's bigger (see above) :-(
> > Maybe a newer gcc would help.
> >
> >
> > >
> > > As for the data memory, it seems the SER use the 1MB pool memory as
> > > default for dynamic memory allocation and 32MB shared memory. If I
> > > only need to support 3600 call per hour, about 1 call per second, and
> > > maximum 80 concurrent calls,
> >
> > For 1 cps with default timeouts you need ~200k. If you want to plan for
> > a DOS: 2.5Mb - 5Mb.
> > For maximum 80 concurent calls 1.6Mb.
> > (rounding up transaction usage to 20k, in reality it's <10k on a 32 bit
> > cpu and a simple no-avps config)
> >
> > Note however that there is some memory needed for internal structures
> > (hashes a.s.o) so you can't probably start ser with less then 2Mb shared
> > memory (at least not 2.1).
> > Try starting with 3Mb (ser -m 3) if you use 0.9.7 or 4 Mb if you use 2.0
> > or 2.1.
> >
> > There are also some compile option that could reduce dramatically the
> > memory usage. For example the size of various hashes (tm hash, dns
> > cache, blacklists a..s.o).
> > I always wanted to introduce a make target or option for embedded
> > systems, that would minimize memory usage at the cost of performance,
> > but I never got to doing it :-(
> >
> >
> > > is the default memory allocation too large? How far can I reduce from
> > > the default? Is there way I can monitor the memory usage for an active
> > > call?
> >
> > You can reduce default shared memory usage by starting ser with a
> > different value: ser -m <value_in_MB>.
> > The pool memory can be reduced only by modifying config.h
> > PKG_MEM_POOL_SIZE and re-compiling. You could porbably get away with 512
> > Kb of pkg mem. (or maybe even less). Just watch out the log for out of
> > memory errors.
> >
> > You can't monitor memory usage per call (in fact ser doesn't even have a
> > "call" notion). On 2.0 or 2.1 you could see the current shared memory
> > usage using sercmd: sercmd core.shmmem.
> > For 0.9.x you could try looking at top output for the "RES" value, or
> > you could use a high log level and look at the log output on exit or
> > after kill -SIGUSR1 <pid_of_ser>.
> >
> >
> > Andrei
> >
_______________________________________________
Serdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/serdev