[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[tor-bugs] #12890 [- Select a component]: Design and implement optimizations for socket write limits
#12890: Design and implement optimizations for socket write limits
----------------------------------+----------------------------
Reporter: robgjansen | Owner: robgjansen
Type: enhancement | Status: new
Priority: normal | Milestone:
Component: - Select a component | Version:
Keywords: | Actual Points:
Parent ID: #12541 | Points:
----------------------------------+----------------------------
KIST has two components: global scheduling (#9262) and socket write
limits. This ticket is to track discussion about the design that should be
implemented to realize socket write limits, and discussion about the
implementation.
The goal of the write limit is to never send to the kernel what the kernel
wouldn't send out to the network anyway due to throttling at the TCP
layer. Rob's USENIX Security paper computed write limits for each socket
as
{{{
sock_space = sock_buf_size - sock_buf_len
tcp_space = (snd_cwnd - snd_unacked) * mss
sock_write_limit = min(sock_space, tcp_space)
}}}
And then a global write limit across all sockets for each scheduling round
is computed according to the upstream bandwidth of the relay and the
configured write callback time interval. Writing in a given round ends
when either the global limit is reached, or all of the socket limits are
reached.
The TCP information can be collected with a getsockopt call, but doing
this for every socket for every write round (callback interval) can get
expensive. A kernel hacker, Patrick McHardy, suggested using the "netlink
socket diag" interface (examples [https://github.com/kristrev/inet-diag-
example/blob/master/inet_monitor.c here] and
[http://linuxgazette.net/136/pfeiffer.html here]) to collect information
for multiple sockets all at once instead of a separate system call for
each.
Note that the socket write limit need not actually be computed, because
the kernel will return EAGAIN when the socket is full anyway. Along these
lines, Bryan Ford suggested setting the socket buffer size based on the
amount Tor thinks it should send plus a little extra (e.g.,
tcp_space*1.25), and then let the kernel push back automatically instead
of trying to compute a new write limit for every socket for every write
interval round. Then Tor can continue to try to write as much as it can
and let the kernel push back when Tor should stop. In this case, we need
to ensure TCP auto-tuning is disabled, as otherwise it may undo our
settings by adjusting our socket buffer sizes underneath us.
I think we need two intervals: e.g., we want to try to write every 10
milliseconds, and then update snd_cwnd/write limits/socket buffer sizes
every 100 milliseconds.
--
Ticket URL: <https://trac.torproject.org/projects/tor/ticket/12890>
Tor Bug Tracker & Wiki <https://trac.torproject.org/>
The Tor Project: anonymity online
_______________________________________________
tor-bugs mailing list
tor-bugs@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-bugs