From mboxrd@z Thu Jan 1 00:00:00 1970 From: Stephen Hemminger Subject: Re: [PATCH iproute2 net-next 0/4] Abstract columns, properly space and wrap fields Date: Fri, 8 Dec 2017 10:29:49 -0800 Message-ID: <20171208102949.0d21cbfd@xeon-e3> References: Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit Cc: netdev@vger.kernel.org, Sabrina Dubroca To: Stefano Brivio Return-path: Received: from mail-pf0-f177.google.com ([209.85.192.177]:32840 "EHLO mail-pf0-f177.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751124AbdLHS3v (ORCPT ); Fri, 8 Dec 2017 13:29:51 -0500 Received: by mail-pf0-f177.google.com with SMTP id y89so7848268pfk.0 for ; Fri, 08 Dec 2017 10:29:51 -0800 (PST) In-Reply-To: Sender: netdev-owner@vger.kernel.org List-ID: On Fri, 8 Dec 2017 18:07:19 +0100 Stefano Brivio wrote: > Currently, 'ss' simply subdivides the whole available screen width > between available columns, starting from a set of hardcoded amount > of spacing and growing column widths. > > This makes the output unreadable in several cases, as it doesn't take > into account the actual content width. > > Fix this by introducing a simple abstraction for columns, buffering > the output, measuring the width of the fields, grouping fields into > lines as they fit, equally distributing any remaining whitespace, and > finally rendering the result. Some examples are reported below [1]. > > This implementation doesn't seem to cause any significant performance > issues, as reported in 3/4. > > Patch 1/4 replaces all relevant printf() calls by the out() helper, > which simply consists of the usual printf() implementation. > > Patch 2/4 implements column abstraction, with configurable column > width and delimiters, and 3/4 splits buffering and rendering phases, > employing a simple buffering mechanism with chunked allocation and > introducing a rendering function. > > Up to this point, the output is still unchanged. > > Finally, 4/4 introduces field width calculation based on content > length measured while buffering, in order to split fields onto > multiple lines and equally space them within the single lines. > > Now that column behaviour is well-defined and more easily > configurable, it should be easier to further improve the output by > splitting logically separable information (e.g. TCP details) into > additional columns. However, this patchset keeps the full "extended" > information into a single column, for the moment being. > > > [1] > > - 80 columns terminal, ss -Z -f netlink > * before: > Recv-Q Send-Q Local Address:Port Peer Address:Port > > 0 0 rtnl:evolution-calen/2075 * pr > oc_ctx=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 > 0 0 rtnl:abrt-applet/32700 * pr > oc_ctx=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 > 0 0 rtnl:firefox/21619 * pr > oc_ctx=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 > 0 0 rtnl:evolution-calen/32639 * p > roc_ctx=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 > [...] > > * after: > Recv-Q Send-Q Local Address:Port Peer Address:Port > 0 0 rtnl:evolution-calen/2075 * > proc_ctx=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 > 0 0 rtnl:abrt-applet/32700 * > proc_ctx=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 > 0 0 rtnl:firefox/21619 * > proc_ctx=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 > 0 0 rtnl:evolution-calen/32639 * > proc_ctx=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 > [...] > > - 80 colums terminal, ss -tunpl > * before: > Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port > udp UNCONN 0 0 *:37732 *:* > udp UNCONN 0 0 *:5353 *:* > udp UNCONN 0 0 192.168.122.1:53 *:* > udp UNCONN 0 0 *%virbr0:67 *:* > [...] > > * after: > Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port > udp UNCONN 0 0 *:37732 *:* > udp UNCONN 0 0 *:5353 *:* > udp UNCONN 0 0 192.168.122.1:53 *:* > udp UNCONN 0 0 *%virbr0:67 *:* > [...] > > - 66 columns terminal, ss -tunpl > * before: > Netid State Recv-Q Send-Q Local Address:Port P > eer Address:Port > udp UNCONN 0 0 *:37732 *:* > > udp UNCONN 0 0 *:5353 *:* > > udp UNCONN 0 0 192.168.122.1:53 > *:* > udp UNCONN 0 0 *%virbr0:67 *:* > [...] > > * after: > Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port > udp UNCONN 0 0 *:37732 *:* > udp UNCONN 0 0 *:5353 *:* > udp UNCONN 0 0 192.168.122.1:53 *:* > udp UNCONN 0 0 *%virbr0:67 *:* > [...] > > > Stefano Brivio (4): > ss: Replace printf() calls for "main" output by calls to helper > ss: Introduce columns lightweight abstraction > ss: Buffer raw fields first, then render them as a table > ss: Implement automatic column width calculation > > misc/ss.c | 893 +++++++++++++++++++++++++++++++++++++++++++------------------- > 1 file changed, 621 insertions(+), 272 deletions(-) > This looks good, would like some acknowledgment from heavy users such as Google that this works for them.