Qualified praise for the Linux ss
program
For a long time now, I've reached for a combination of netstat
and 'lsof -n -i
' whenever I wanted to know things like who was
talking to what on a machine. Mostly I've tended to use lsof
,
even though it's slower, because I find netstat
to be vaguely
annoying (and I can never the exact options I want without checking
the manpage yet again). Recently I've started to use another program
for this, ss
,
which is part of the iproute2 suite (also
Wikipedia).
The advantage of ss
is that it will give you a bunch of useful
information, quite compactly, and it will do this very fast and
without fuss and bother. Do you want to know every listening TCP
socket and what program or programs are behind it? Then you want
'ss -tlp
'. The output is pretty parseable, which makes it easy
to feed to programs, and a fair bit of information is available
without root privileges. You can also have ss
filter the output
so that you don't have to, or at least so that you don't have to
do as much.
In addition, some of the information that ss
will give you is
relatively hard to get anywhere else (or at least easily) and can
be crucial to understanding network issues. For example, 'ss -i
'
will show you the PMTU and MSS of TCP connections, which can be
very useful for some sorts of network issues.
One recent case where I reached for ss
was I wanted to get a list
of connections to the local machine's port 25 and port 587, so I
could generate metrics information for how many SMTP connections our
mail servers were seeing. In ss
, the basic command for this is:
ss -t state established '( sport = :25 or sport = :587 )'
(Tracking this information was useful to establish that we really were seeing a blizzard of would-be spammers connecting to our external MX gateway and clogging up its available SMTP connections.)
Unfortunately, this is where the qualifications come in. As you can
see here, ss
has a filtering language, and a reasonably capable
one at that. Unfortunately, this filtering language is rather
underdocumented (much like many things in iproute2). Using ss
without any real documentation on its filtering language is kind
of frustrating, even when I'm not trying to write a filter expression.
There is probably a bunch of power that I could use, except it's
on the other side of a glass wall and I can't touch it. In theory
there's documentation somewhere; in practice I'm left reading other
people's articles like this and this copy of
the original documentation.
(This is my big lament about ss
.)
As you'll see if you play around with it, ss
also has a weird
output format for all of its extended information. I'm sure it makes
sense to its authors, and you can extract it with determination
('egrep -o
' will help),
but it isn't the easiest thing in the world to deal with. It's also
not the most readable thing in the world if you're using ss
interactively. It helps a bit to have a very wide terminal window.
Despite my gripes about it, I've wound up finding ss
an increasingly
important tool that I reach for more and more. Partly this is for
all of the information it can tell me, partly it's for the filtering
capabilities, and partly it's for its speed and low impact on the
system.
(Also, unlike lsof
, it doesn't complain about random things every
so often.)
(ss
was mentioned in passing back when I wrote about how there's
real reasons for Linux to replace ifconfig and netstat. I don't think of ss
as a replacement
for netstat
so much as something that effectively obsoletes it;
ss
is just better, even in its relatively scantily documented and
awkward state. With that said, modern Linux netstat
actually shows
more information than I was expecting, and in some ways it's in a
more convenient and readable form than ss
provides. I'm probably
still going to stick with ss
for various reasons.)
|
|