Joan Lledó <joanlluisll...@gmail.com> writes:

> The last item in my initial TODO list was implementing the --peer
> option available in pfinet. This week I've been working on it and it's
> now done, so I can say the LwIP translator is now able to replace
> pfinet.

And indeed, I'm using lwip on my development box right now:

root@hurdbox ~ # fsysopts /servers/socket/2
/hurd/lwip --interface=/dev/eth0m/0 --address=192.168.122.246 
--netmask=255.255.255.0 --gateway=192.168.122.1 
--address6=FE80::5054:28FF:FE44:31B6/64

This is excellent work, thank you very much.  So what remains to be done
until we can merge this is to address the scalability issues.  I'll
paste the discussion from
http://richtlijn.be/~larstiq/hurd/hurd-2017-07-25
here so that we can discuss this further:

11:59:43< teythoon> i see two issues with the lwip codebase, and we need to 
talk about how we address them in a way compatible with the goals of the 
upstream project
12:01:11< teythoon> jlledom: issue 1/ are the static arrays for sockets etc
12:01:21< teythoon> we need to be able to dynamically allocate such objects
12:01:25< jlledom> OK
12:01:37< teythoon> but we need to introduce it so that it is acceptable 
upstream
12:01:47< teythoon> so it must not degrade the performance on embedded systems
12:02:10< teythoon> maybe we can introduce an abstraction with two backends
12:02:13< teythoon> of some kind
12:02:27< teythoon> macros or functions that can be inlined
12:02:47< teythoon> but it should not add any overhead
12:02:54< teythoon> not in code size, not in memory
12:03:23< jlledom> I'm gonna eat, bbl
12:03:40< teythoon> you seem to be working good with the lwip community, i'd 
suggest to raise the issue somewhere, maybe the list
12:03:42< teythoon> ok
12:03:45< teythoon> i'll keep writing
12:04:31< teythoon> point 2/ is performance
12:04:35< teythoon> or related to performance
12:04:50< teythoon> it is not that important though, but worth keeping an eye on
12:05:10< teythoon> i did some experiments on tcp throughput using iperf
12:06:04< teythoon> for me, pfinet was doing double the throughput lwip did
12:06:22< teythoon> now that may also be due to how i compiled lwip
12:06:34< teythoon> i haven't done better tests
12:06:37< teythoon> sorry
12:06:50< teythoon> but i am worried about the one global lock that lwip uses
12:07:08< teythoon> that on embedded systems is implemented by disabling 
interrupts
12:07:30< teythoon> which is very fast and on singleprocessor systems very cheap
12:08:18< teythoon> but on posix platforms (or in the code in your repo) lwip 
is replacing that with one badly implemented recursive lock on top of a pthread 
mutex
12:08:30< teythoon> and that is a very heavyweight primitive in comparison
12:09:16< teythoon> there, it is possible with some work to introduce a better 
abstraction
12:12:32< teythoon> currently, there are two macros, SYS_ARCH_PROTECT(lev) and 
SYS_ARCH_UNPROTECT(lev)
12:12:58< teythoon> now, lev is a local variable that stores processor flags
12:13:14< teythoon> this is how the disabling of interrupts is made recursive
12:14:05< teythoon> the old state is saved in lev when locking, the interrupts 
are disabled, and the saved state restored on unlocking
12:15:15< teythoon> i'd suggest to replace this with per-resource locks on 
posix systems
12:15:48< teythoon> for that, a per-resource variable must be defined (in 
addition to the per-critical section local variables)
12:16:13< teythoon> then, both must be passed to SYS_ARCH_PROTECT, e.g. 
SYS_ARCH_PROTECT(lock,lev)
12:16:34< teythoon> now, on embedded system we can leverage 'lev' to implement 
the former scheme
12:16:47< teythoon> and on posix systems, we can just use 
pthread_mutex_lock(lock)
12:18:09< teythoon> using posix mutexes with attribute PTHREAD_MUTEX_RECURSIVE
12:19:53< teythoon> (big picture: i'm worried about contention on that lock)
12:20:24< teythoon> so we need to introduce a more fine-grained locking system
12:20:32< teythoon> again without imposing any overhead on small systems
12:20:47< teythoon> this should be done using macros by extending 
SYS_ARCH_PROTECT and friends

Now I realize that you said the performance issue may be due to
insufficient TCP tuning, but I'm still worried about contention.  But
problem 1/ is a killer, we cannot arbitrarily restrict the number of
sockets like that.


Cheers,
Justus

Attachment: signature.asc
Description: PGP signature

Reply via email to