git: ipfw: Rework states and tracks.
Sepherosa Ziehau
sephe at crater.dragonflybsd.org
Tue Sep 5 02:28:04 PDT 2017
commit 2187815d4cfbe09db545787d4cbed10e31341b8c
Author: Sepherosa Ziehau <sephe at dragonflybsd.org>
Date: Wed Aug 16 11:56:45 2017 +0800
ipfw: Rework states and tracks.
- Use RB tree for states and tracks. And put them into their own RB
trees. This avoid worst case hash collision.
- Make states per-cpu. Upper limit is still shared, and is managed in
the same fashion as our slab allocator's upper limit, i.e. loosely
updated, which allows 5% over-allocation at most.
- Use two tiers for tracks. The top tier is shared, which maintains
the counter. The second tier is per-cpu, most of the track looking
up should be coverd by this tier. Track counters are updated by
atomic ops, since per-track upper limit is usually too small to use
loose updating.
- Implement progressive state/track expiration and keepalive. It is
mainly intended to make the packet processing latency more smooth.
- Fix fast TCP state recycling issue by tracking the SEQs in addition
to the ACKs.
This drastically improves performance, and reduces/stablizes latency.
For exmaple, nginx, 1KB web object, 30K concurrent connections,
1 request/connection. ipfw is running on the server side.
ipfw non-default setting:
- Max # of states for new-ipfw is 100K (~14MB memory).
- Max # of states for old-ipfw is 500K, and # of hash buckets is 64K.
ipfw rules:
ipfw add 1 check-state
ipfw add allow tcp from any to me 80 setup keep-state
(default deny)
| perf-avg | lat-avg | lat-stdev | lat-99% | lat-max
| (tps) | (ms) | (ms) | (ms) | (ms)
---------+-----------+---------+-----------+---------+---------
no-ipfw | 210658.80 | 58.01 | 5.20 | 68.73 | 146.46
---------+-----------+---------+-----------+---------+---------
new-ipfw | 191626.58 | 64.74 | 5.69 | 75.87 | 166.08
---------+-----------+---------+-----------+---------+---------
old-ipfw | 43481.19 | 153.76 | 47.32 | 296.61 | 425.09
If it is compared w/ no-ipfw case, the performance and latency impacts
of the ipfw after this commit are pretty small.
Summary of changes:
sys/net/ipfw/ip_fw2.c | 3240 +++++++++++++++++++++++++++++---------------
sys/net/ipfw/ip_fw2.h | 40 +-
sys/net/ipfw/ip_fw2_glue.c | 4 +-
3 files changed, 2164 insertions(+), 1120 deletions(-)
http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff/2187815d4cfbe09db545787d4cbed10e31341b8c
--
DragonFly BSD source repository
More information about the Commits
mailing list