Creating a Trustworthy Active Web
Download
Report
Transcript Creating a Trustworthy Active Web
Ken Birman
Cornell University. CS5410 Fall 2008.
Mission Impossible…
Today, multicast is persona non-grata
in most cloud settings
Amazon’s stories of their experience with violent load
oscillations has frightened most people in the industry
They weren’t the only ones…
Today:
Design a better multicast infrastructure for using the
Linux Red Hat operating system in enterprise settings
Target: trading floor in a big bank (if any are left) on
Wall Street, cloud computing in data centers
What do they need?
Quick, scalable, pretty reliable message delivery
Argues for IPMC or a protocol like Ricochet
Virtual synchrony, Paxos, transactions: all would be
examples of higher level solutions running over the
basic layer we want to design
But we don’t want our base layer to misbehave
And it needs to be a good “team player” side by side
with TCP and other protocols
Reminder: What goes wrong?
Earlier in the semester we touched on the issues with
IPMC in existing cloud platforms
Applications unstable, exhibit violent load swings
Usually totally lossless, but sometimes drops zillions of
packets all over the place
Worst of all?
Problems impacted not just IPMC but also disrupted
UDP, TCP, etc. And they got worse, not better, with
faster networks!
Start by trying to understand the big picture: why is
this happening?
Misbehavior pattern
Noticed when an application-layer solution, like a
virtual synchrony protocol, begins to exhibit wild load
swings for no obvious reason QSM oscillated in this 200-node experiment when its
damping and prioritization mechanisms were disabled
we saw this in QSM
(Quicksilver
Scalable Multicast)
Fixing the problem
at the end-to-end
layer was really hard!
messages /s
For example,
12000
10000
8000
6000
4000
2000
0
250
400
550 700
time (s)
850
Aside: QSM works well now
We did all sorts of things to stabilize it
Novel “minimal memory footprint” design
Incredibly low CPU loads minimize delays
Prioritization mechanisms ensure that lost data is
repaired first, before new good data piles up behind gap
But most systems lack these sorts of unusual solutions
Hence most systems simply destabilize, like QSM did
before we studied and fixed these issues!
Linux goal: a system-wide solution
It wasn’t just QSM…
This graph was for Quicksilver but
Most products are prone to destabilization of this sort
And they often break down in ways that disrupt
everyone else
What are the main forms of data center-wide issues?
Convoy effects
One problem is called a convoy effect
Tends to occur suddenly
System transitions from being load-balanced to a state
in which there are always a small set of hot spots, very
overloaded, and everything else is pretty much idle
Hot spots might move around (like Heisenbugs)
Underlying cause?
Related to phenomena that cause traffic to slow down on
highways…
Convoy effects
Imagine that you are on a highway driving fast
With a low density of cars, small speed changes make no
difference
But if you are close to other cars, a “coupling” effect will
occur: the car in front slows down, so you slow down,
and suddenly cars bunch up – they form a convoy
In big distributed systems this is also seen when load
rises to a point where minor packet scheduling delays
start to cascade. Seen in any componentized system
Convoys were just one culprit…
Why was QSM acting this way?
When we started work, this wasn’t easy to fix…
… issue occurred only with 200 nodes and high data rates
But we tracked down a loss related pattern
Under heavy load, the network was delivering packets to
our receivers faster than they could handle them
Caused kernel-level queues to overflow… hence wide loss
Retransmission requests and resends made things worse
So: goodput drops to zero, overhead to infinity. Finally
problem repaired and we restart… only to do it again!
IPMC and loss
In fact, one finds that
In systems that don’t use IPMC, packet loss is rare,
especially if they use TPC throughout
But with IPMC, all forms of communication get lossy!
This impacts not just IPMC, but also UDP, TCP
TCP reacts by choking back (interprets loss as congestion)
Implication: somehow IPMC is triggering loss not seen
when IPMC is not in use. Why???
Assumption?
Assume that if we enable IP multicast
Some applications will use it heavily
Testing will be mostly on smaller configurations
Thus, as they scale up and encounter loss, many will be
at risk of oscillatory meltdowns
Fixing the protocol is obviously the best solution…
… but we want the data center (the cloud) to also protect
itself against disruptive impact of such events!
So why did receivers get so lossy?
To understand the issue, need to understand history of
network speeds and a little about the hardware
(4) NIC sends…
(5) NIC receives…
ethernet
NIC
(3) Enqueued for NIC to
(6) Copied into a handy
send
mbuf
NIC
(2) UDP adds header,
(7) UDP queues on socket
fragments it
kernel
(1) App sends packet
user
(8) App receives
kernel
user
Network speeds
When Linux was developed, Ethernet ran at 10Mbits
and NIC was able to keep up
Then network sped up: 100Mbits common, 1Gbit more
and more often seen, 10 or 40 “soon”
But typical PCs didn’t speed up remotely that much!
Why did PC speed lag?
Ethernets transitioned to optical hardware
PCs are limited by concerns about heat, expense. Trend
favors multicore solutions that run slower… so why
invest to create a NIC that can run faster than the bus?
NIC as a “rate matcher”
Modern NIC has two sides running at different rates
Ethernet side is blazingly fast, uses ECL memory…
Main memory side is slower
So how can this work?
Key insight: NIC usually receives one packet, but then
doesn’t need to accept the “next” packet.
Gives it time to unload the incoming data
But why does it get away with this?
NIC as a “rate matcher”
When would a machine get several back-to-back
packets?
Server with many clients
Pair of machines with a stream between them: but here,
limited because the sending NIC will run at the speed of
its interface to the machine’s main memory – in today’s
systems, usually 100MBits
In a busy setting, only servers are likely to see back-to-
back traffic, and even the server is unlikely to see a
long run packets that it needs to accept!
… So normally
NIC sees big gaps between messages it needs to accept
This gives us time…
…. for OS to replenish the supply of memory buffers
…. to hand messages off to the application
In effect, the whole “system” is well balanced
But notice the hidden assumption:
All of this requires that most communication be point-topoint… with high rates of multicast, it breaks down!
Multicast: wrench in the works
What happens when we use multicast heavily?
A NIC that on average received 1 out of k packets
suddenly might receive many in a row (just thinking in
terms of the “odds”)
Hence will see far more back-to-back packets
But this stresses our speed limits
NIC kept up with fast network traffic partly because it
rarely needed to accept a packet… letting it match the
fast and the slow sides…
With high rates of incoming traffic we overload it
Intuition: like a highway off-ramp
With a real highway, cars just
end up in a jam
With a high speed optical net
coupled to a slower NIC, packets
are dropped by receiver!
More NIC worries
Next issue relates to implementation of multicast
Ethernet NIC actually is a pattern match machine
Kernel loads it with a list of {mask,value} pairs
Incoming packet has a destination address
Computes (dest&mask)==value and if so, accepts
Usually has 8 or 16 such pairs available
More NIC worries
If the set of patterns is full… kernel puts NIC into what
we call “promiscuous” mode
It starts to accept all incoming traffic
Then OS protocol stack makes sense of it
If not-for-me, ignore
But this requires an interrupt and work by the kernel
All of which adds up to sharply higher
CPU costs (and slowdown due to cache/TLB effects)
Loss rate, because the more packets the NIC needs to
receive, the more it will drop due to overrunning queues
More NIC worries
We can see this effect in an experiment done by Yoav
Costs of “filtering”
load the CPU…
Tock at IBM Research in Haifa
Packet loss rate %
25
20
15
All slots full
10
5
0
1
2
5
10
20
50
100
200
250
300
When many groups are used, CPU loads rise and
machine can’t keep up with traffic. O/S drops packets
What about the switch/router?
Modern data centers used a switched network
architecture
Question to ask: how does a switch handle multicast?
Concept of a Bloom filter
Goal of router?
Packet p arrives on port a. Quickly decide which port(s)
to forward it on
Bit vector filter approach
Take IPMC address of p, hash it to a value in some range
like [0..1023]
Each output port has an associated bit vector… Forward
p on each port with that bit set
Bitvector -> Bloom filter
Just do the hash multiple times, test against multiple
vectors. Must match in all of them (reduces collisions)
Concept of a Bloom filter
So… take our class-D multicast address (233.0.0.0/8)
233.17.31.129… hash it 3 times to a bit number
Now look at outgoing link A
Check bit 19 in [….0101010010000001010000010101000000100000….]
Check bit 33 in […. 101000001010100000010101001000000100000….]
Check bit 8 in [….0000001010100000011010100100000010100000..]
… all matched, so we relay a copy
Next look at outgoing link B
… match failed
… ETC
What about the switch/router?
Modern data centers used a switched network
architecture
p
*
*
p
p
Question to ask: how does a switch handle multicast?
Aggressive use of multicast
Bloom filters “fill up” (all bits set)
Not for a good reason, but because of hash conflicts
Hence switch becomes promiscuous
Forwards every multicast on every network link
Amplifies problems confronting NIC, especially if NIC
itself is in promiscuous mode
Worse and worse…
Most of these mechanisms have long memories
Once an IPMC address is used by a node, the NIC tends
to retain memory of it, and the switch does, for a long
time
This is an artifact of a “stateless” architecture
Nobody remembers why the IPMC address was in use
Application can leave but no “delete” will occur for a while
Underlying mechanisms are lease based: periodically
“replaced” with fresh data (but not instantly)
…pulling the story into focus
We’ve seen that multicast loss phenomena can
ultimately be traced to two major factors
Modern systems have a serious rate mismatch vis-à-vis
the network
Multicast delivery pattern and routing mechanisms
scale poorly
A better Linux architecture needs to
Allow us to cap the rate of multicasts
Allow us to control which apps can use multicast
Control allocation of a limited set of multicast groups
Dr. Multicast (the MCMD)
Rx for your multicast woes
Intercepts use of IPMC
Does this by library interposition exploiting a feature of
DLL linkage
Then maps the logical IPMC address used by the
application to either
A set of point-to-point UDP sends
A physical IPMC address, for lucky applications
Multiple groups share same IPMC address for efficiency
Criteria used
Dr Multicast has an “acceptable use policy”
Currently expressed as low-level firewall type rules, but
could easily integrate with higher level tools
Examples
Application such-and-such can/cannot use IPMC
Limit the system as a whole to 50 IPMC addresses
Can revoke IPMC permission rapidly in case of trouble
How it works
Application uses IPMC
Receiver (one of many)
source
IPMC
event
UDP
multicast
interface
Socket
interface
How it works
Application uses IPMC
Receiver (one of many)
source
Replace UDP multicast
with some other multicast
protocol, like Ricochet
IPMC
event
UDP
multicast
interface
Socket
interface
UDP multicast interface
Main UDP system calls
Socket() – creates a socket
Bind() connects that socket to the UDP multicast
distribution network
Sendmsg/recvmsg() – send data
Dynamic library “trick”
Using multiple dynamically linked libraries, we can
intercept system calls
Application used to link to, say, libc.so/libc.sa
We add a library libx.so/libx.sa earlier on lib search path
It defines the socket interfaces, hence is linked in
But it also does calls to __Xbind, __Xsendmsg, etc
Now we add liby.so, liby.sa
These define __Xbind – it just calls bind – etc
We get to either “handle” calls ourselves, in libx, or
pass them to the normal libc “via” liby.
Mimicry
Many options could mimic IPMC
Point to point UDP or TCP, or even HTTP
Overlay multicast
Ricochet (adds reliability)
MCMD can potentially swap any of these in under user
control
Optimization
Problem of finding an optimal group-to-IPMC
mapping is surprisingly hard
Goal is to have an “exact mapping” (apps receive exactly
the traffic they should receive). Identical groups get the
same IPMC address
But can also fragment some groups….
A
B
Should we give an IPMC address to A, to B, to AB?
Turns out to be NP complete!
Greedy heuristic
Dr Multicast currently uses a greedy heuristic
Looks for big, busy groups and allocates IPMC addresses
to them first
Limited use of group fragmentation
We’ve explored more aggressive options for fragmenting
big groups into smaller ones, but quality of result is very
sensitive to properties of the pattern of group use
Solution is fast, not optimal, but works well
Flow control
How can we address rate concerns?
A good way to avoid broadcast storms is to somehow
suppose an AUP of the type “at most xx IPMC/sec”
Two sides of the coin
Most applications are greedy and try to send as fast as
they can… but would work on a slower or more
congested network.
For these, we can safely “slow down” their rate
But some need guaranteed real-time delivery
Currently can’t even specify this in Linux
Flow control
Approach taken in Dr Multicast
Again, starts with an AUP
Puts limits on the aggregate IPMC rate in the data center
And can exempt specific applications from rate limiting
Next, senders in a group monitor traffic in it
Conceptually, happens in the network driver
Use this to apportion limited bandwidth
Sliding scale: heavy users give up more
Flow control
To make this work, the kernel send layer can delay
sending packets…
… and to prevent application from overrunning the
kernel, delay the application
For sender using non-blocking mode, can drop packets
if sender side becomes overloaded
Highlights a weakness of the standard Linux interface
No easy way to send “upcalls” notifying application
when conditions change, congestion arises, etc
The “AJIL” protocol in action
Protocol adds a rate
limiting module to the
Dr Multicast stack
Uses a gossip-like
mechanism to figure
out the rate limits
Work by Hussam AbuLibdeh and others in
my research group
Fast join/leave patterns
Currently Dr Multicast doesn’t do very much if
applications thrash by joining and leaving groups
rapidly
We have ideas on how to rate limit them, and it seems
like it won’t be hard to support
Real question is: how should this behave?
End to End philosophy / debate
In the dark ages, E2E idea was proposed as a way to
standardize rules for what should be done in the
network and what should happen at the endpoints
In the network?
Minimal mechanism, no reliability, just routing
(Idea is that anything more costs overhead yet end
points would need the same mechanisms anyhow, since
best guarantees will still be too weak)
End points do security, reliability, flow control
A religion… but inconsistent…
E2E took hold and became a kind of battle cry of the
Internet community
But they don’t always stick with their own story
Routers drop packets when overloaded
TCP assumes this is the main reason for loss and backs
down
When these assumptions break down, as in wireless or
WAN settings, TCP “out of the box” performs poorly
E2E and Dr Multicast
How would the E2E philosophy view Dr Multicast?
On the positive side, the mechanisms being interposed
operate mostly on the edges and under AUP control
On the negative side, they are network-wide
mechanisms imposed on all users
Original E2E paper had exceptions, perhaps this falls
into that class of things?
E2E except when doing something something in the
network layer brings big win, costs little, and can’t be
done on the edges in any case…
Summary
Dr Multicast brings a vision of a new world of
controlled IPMC
Operator decides who can use it, when, and how much
Data center no longer at risk of instability from
malfunctioning applications
Hence operator allows IPMC in: trust (but verify, and if
problems emerge, intervene)
Could reopen door for use of IPMC in many settings