ss: implement -M option to get all memory information
Subsystems (2)
PATCH 2/2 ss: implement -M option to get all memory information
From: Shan Wei <[email protected]>
INET_DIAG_SKMEMINFO is used to monitor socket memory information which contains more information than INET_DIAG_MEMINFO.
-m option is retained for old kernel that don't surpport INET_DIAG_SKMEMINFO.
--- misc/ss.c | 27 +++++++++++++++++++++++++-- 1 files changed, 25 insertions(+), 2 deletions(-)
misc/ss.c +25 -2
@@ -45,6 +45,7 @@ int show_options = 0;int show_details =0 ;int show_users =0 ;int show_mem =0 ; +int show_skmem =0 ;int show_tcpinfo =0 ;int netid_width;
@@ -1410,6 +1411,19 @@ static void tcp_show_info(const struct nlmsghdr *nlh, struct inet_diag_msg *r)printf (" rcv_space:%d" , info->tcpi_rcv_space); } + +if (tb[INET_DIAG_SKMEMINFO ]) { +const unsigned int *skmeminfo =RTA_DATA (tb[INET_DIAG_SKMEMINFO ]); +printf (" skmem:(r%u,rb%u,t%u,tb%u,f%u,w%u,o%u)" , + skmeminfo[SK_MEMINFO_RMEM_ALLOC ], + skmeminfo[SK_MEMINFO_RCVBUF ], + skmeminfo[SK_MEMINFO_WMEM_ALLOC ], + skmeminfo[SK_MEMINFO_SNDBUF ], + skmeminfo[SK_MEMINFO_FWD_ALLOC ], + skmeminfo[SK_MEMINFO_WMEM_QUEUED ], + skmeminfo[SK_MEMINFO_OPTMEM ]); + } + }static int tcp_show_sock (struct nlmsghdr *nlh,struct filter *f)
@@ -1466,7 +1480,7 @@ static int tcp_show_sock(struct nlmsghdr *nlh, struct filter *f)printf ("%08x" , r->id.idiag_cookie[1 ]);printf ("%08x" , r->id.idiag_cookie[0 ]); } -if (show_mem || show_tcpinfo) { +if (show_mem || show_tcpinfo || show_skmem) {printf ("\n\t" );tcp_show_info (nlh, r); }
@@ -1508,6 +1522,9 @@ static int tcp_show_netlink(struct filter *f, FILE *dump_fp, int socktype)if (show_mem) req.r.idiag_ext |= (1 <<(INET_DIAG_MEMINFO -1 )); +if (show_skmem) + req.r.idiag_ext |= (1 <<(INET_DIAG_SKMEMINFO -1 )); +if (show_tcpinfo) { req.r.idiag_ext |= (1 <<(INET_DIAG_INFO -1 )); req.r.idiag_ext |= (1 <<(INET_DIAG_VEGASINFO -1 ));
@@ -2581,6 +2598,8 @@ static void _usage(FILE *dest)" -o, --options show timer information\n" " -e, --extended show detailed socket information\n" " -m, --memory show socket memory usage\n" +" -M, --skmem show socket memory information.\n" +" this option which will replace -m, is valid since Linux 3.3.\n" " -p, --processes show process using socket\n" " -i, --info show internal TCP information\n" " -s, --summary show socket usage summary\n"
@@ -2652,6 +2671,7 @@ static const struct option long_opts[] = { { "options", 0, 0, 'o' }, { "extended", 0, 0, 'e' }, { "memory", 0, 0, 'm' }, + { "skmem", 0, 0, 'M'} { "info", 0, 0, 'i' }, { "processes", 0, 0, 'p' }, { "dccp", 0, 0, 'd' },
@@ -2690,7 +2710,7 @@ int main(int argc, char *argv[]) current_filter.states = default_filter.states; -while ((ch =getopt_long (argc, argv,"dhaletuwxnro460spf:miA:D:F:vV" , +while ((ch =getopt_long (argc, argv,"dhaletuwxnro460spf:mMiA:D:F:vV" , long_opts,NULL )) !=EOF ) {switch (ch) {case 'n' :
@@ -2709,6 +2729,9 @@ int main(int argc, char *argv[])case 'm' : show_mem =1 ;break ; +case 'M' : + show_skmem =1 ; +break ;case 'i' : show_tcpinfo =1 ;break ;
Signature · 1 line
1.7.1
Quoted 65 lines · On Wed, 25 Apr 2012 15:15:27 +0800 Shan Wei <[email protected]> wrote:
From: Shan Wei <[email protected]>
INET_DIAG_SKMEMINFOis used to monitor socket memory information which contains more information thanINET_DIAG_MEMINFO.-m option is retained for old kernel that don't surpport
INET_DIAG_SKMEMINFO.Signed-off-by Shan Wei <[email protected]>--- misc/ss.c | 27 +++++++++++++++++++++++++-- 1 files changed, 25 insertions(+), 2 deletions(-)misc/ss.c +18
-1@@ -45,6 +45,7 @@ int show_options = 0;int show_details =0 ;int show_users =0 ;int show_mem =0 ; +int show_skmem =0 ;int show_tcpinfo =0 ;int netid_width;@@ -1410,6 +1411,19 @@ static void tcp_show_info(const struct nlmsghdr *nlh, struct inet_diag_msg *r)printf (" rcv_space:%d" , info->tcpi_rcv_space); } + +if (tb[INET_DIAG_SKMEMINFO ]) { +const unsigned int *skmeminfo =RTA_DATA (tb[INET_DIAG_SKMEMINFO ]); +printf (" skmem:(r%u,rb%u,t%u,tb%u,f%u,w%u,o%u)" , + skmeminfo[SK_MEMINFO_RMEM_ALLOC ], + skmeminfo[SK_MEMINFO_RCVBUF ], + skmeminfo[SK_MEMINFO_WMEM_ALLOC ], + skmeminfo[SK_MEMINFO_SNDBUF ], + skmeminfo[SK_MEMINFO_FWD_ALLOC ], + skmeminfo[SK_MEMINFO_WMEM_QUEUED ], + skmeminfo[SK_MEMINFO_OPTMEM ]); + } + }static int tcp_show_sock (struct nlmsghdr *nlh,struct filter *f)@@ -1466,7 +1480,7 @@ static int tcp_show_sock(struct nlmsghdr *nlh, struct filter *f)printf ("%08x" , r->id.idiag_cookie[1 ]);printf ("%08x" , r->id.idiag_cookie[0 ]); } -if (show_mem || show_tcpinfo) { +if (show_mem || show_tcpinfo || show_skmem) {printf ("\n\t" );tcp_show_info (nlh, r); }@@ -1508,6 +1522,9 @@ static int tcp_show_netlink(struct filter *f, FILE *dump_fp, int socktype)if (show_mem) req.r.idiag_ext |= (1 <<(INET_DIAG_MEMINFO -1 )); +if (show_skmem) + req.r.idiag_ext |= (1 <<(INET_DIAG_SKMEMINFO -1 )); +if (show_tcpinfo) { req.r.idiag_ext |= (1 <<(INET_DIAG_INFO -1 )); req.r.idiag_ext |= (1 <<(INET_DIAG_VEGASINFO -1 ));
misc/ss.c static void _usage(FILE *dest) · line 2602
Quoted 5 lines
misc/ss.c +2
-0@@ -2581,6 +2598,8 @@ static void _usage(FILE *dest)" -o, --options show timer information\n" " -e, --extended show detailed socket information\n" " -m, --memory show socket memory usage\n" +" -M, --skmem show socket memory information.\n" +" this option which will replace -m, is valid since Linux 3.3.\n"
Please don't add reference to kernel version.
Why does this need to be a new option? Maybe just do the right thing if present in the netlink response?
Stephen Hemminger said, at 2012/4/26 1:41:
Quoted 7 lines
Quoted 3 lines
" -m, --memory show socket memory usage\n" +" -M, --skmem show socket memory information.\n" +" this option which will replace -m, is valid since Linux 3.3.\n"Please don't add reference to kernel version.
Why does this need to be a new option? Maybe just do the right thing if present in the netlink response?
Actually, I'm ok for your suggestion that using a existing option(-m) to export all memory information. But with a new option is better for us.
Maybe some people use latest iproute source with under kernel 3.3.0, some don't. -m option will take different user experience, specially for UDP socket. Currently -m option has no effect on UDP socket which i will submit another patch to export memory information for. new option, fresh experience.
(Exporting out memory information will help us to analysis dropped packets which recorded in RcvbufErrors and SndbufErrors.)
Quoted 6 lines · On Fri, 27 Apr 2012 10:04:17 +0800 Shan Wei <[email protected]> wrote:
Stephen Hemminger said, at 2012/4/26 1:41:
Quoted 4 lines
Quoted 3 lines
" -m, --memory show socket memory usage\n" +" -M, --skmem show socket memory information.\n" +" this option which will replace -m, is valid since Linux 3.3.\n"
Quoted 7 lines
Quoted 3 lines
Please don't add reference to kernel version.
Why does this need to be a new option? Maybe just do the right thing if present in the netlink response?Actually, I'm ok for your suggestion that using a existing option(-m) to export all memory information. But with a new option is better for us.
Why? if you are arguing to replace the option anyway.
Quoted 4 lines
Maybe some people use latest iproute source with under kernel 3.3.0, some don't. -m option will take different user experience, specially for UDP socket. Currently -m option has no effect on UDP socket which i will submit another patch to export memory information for. new option, fresh experience.
Lots of options return more or different information based on kernel version, probably the biggest example is how stats are processed.
Quoted 6 lines
(Exporting out memory information will help us to analysis dropped packets which recorded in RcvbufErrors and SndbufErrors.)
Hi stephen:
Stephen Hemminger said, at 2012/4/28 1:21:
Quoted 2 lines
Lots of options return more or different information based on kernel version, probably the biggest example is how stats are processed.
how about the following patch?
----
[PATCH] ss: use new INET_DIAG_SKMEMINFO option to get memory information for tcp socket
--- misc/ss.c | 16 ++++++++++++++-- 1 files changed, 14 insertions(+), 2 deletions(-)
misc/ss.c +14 -2
@@ -1336,7 +1336,17 @@ static void tcp_show_info(const struct nlmsghdr *nlh, struct inet_diag_msg *r)parse_rtattr (tb,INET_DIAG_MAX , (struct rtattr *)(r+1 ), nlh->nlmsg_len -NLMSG_LENGTH (sizeof (*r))); -if (tb[INET_DIAG_MEMINFO ]) { +if (tb[INET_DIAG_SKMEMINFO ]) { +const unsigned int *skmeminfo =RTA_DATA (tb[INET_DIAG_SKMEMINFO ]); +printf (" skmem:(r%u,rb%u,t%u,tb%u,f%u,w%u,o%u)" , + skmeminfo[SK_MEMINFO_RMEM_ALLOC ], + skmeminfo[SK_MEMINFO_RCVBUF ], + skmeminfo[SK_MEMINFO_WMEM_ALLOC ], + skmeminfo[SK_MEMINFO_SNDBUF ], + skmeminfo[SK_MEMINFO_FWD_ALLOC ], + skmeminfo[SK_MEMINFO_WMEM_QUEUED ], + skmeminfo[SK_MEMINFO_OPTMEM ]); + }else if (tb[INET_DIAG_MEMINFO ]) {const struct inet_diag_meminfo *minfo =RTA_DATA (tb[INET_DIAG_MEMINFO ]); printf(" mem:(r%u,w%u,f%u,t%u)",
@@ -1505,8 +1515,10 @@ static int tcp_show_netlink(struct filter *f, FILE *dump_fp, int socktype)memset (&req.r,0 ,sizeof (req.r)); req.r.idiag_family =AF_INET ; req.r.idiag_states = f->states; -if (show_mem) +if (show_mem) { req.r.idiag_ext |= (1 <<(INET_DIAG_MEMINFO -1 )); + req.r.idiag_ext |= (1 <<(INET_DIAG_SKMEMINFO -1 )); + }if (show_tcpinfo) { req.r.idiag_ext |= (1 <<(INET_DIAG_INFO -1 ));
Signature · 1 line
1.7.1
Quoted 44 lines · On Wed, 02 May 2012 17:45:02 +0800 Shan Wei <[email protected]> wrote:
Hi stephen:
Stephen Hemminger said, at 2012/4/28 1:21:
Quoted 2 lines
Lots of options return more or different information based on kernel version, probably the biggest example is how stats are processed.
how about the following patch?
----
[PATCH] ss: use newINET_DIAG_SKMEMINFOoption to get memory information for tcp socketSigned-off-by Shan Wei <[email protected]>--- misc/ss.c | 16 ++++++++++++++-- 1 files changed, 14 insertions(+), 2 deletions(-)misc/ss.c +11
-1@@ -1336,7 +1336,17 @@ static void tcp_show_info(const struct nlmsghdr *nlh, struct inet_diag_msg *r)parse_rtattr (tb,INET_DIAG_MAX , (struct rtattr *)(r+1 ), nlh->nlmsg_len -NLMSG_LENGTH (sizeof (*r))); -if (tb[INET_DIAG_MEMINFO ]) { +if (tb[INET_DIAG_SKMEMINFO ]) { +const unsigned int *skmeminfo =RTA_DATA (tb[INET_DIAG_SKMEMINFO ]); +printf (" skmem:(r%u,rb%u,t%u,tb%u,f%u,w%u,o%u)" , + skmeminfo[SK_MEMINFO_RMEM_ALLOC ], + skmeminfo[SK_MEMINFO_RCVBUF ], + skmeminfo[SK_MEMINFO_WMEM_ALLOC ], + skmeminfo[SK_MEMINFO_SNDBUF ], + skmeminfo[SK_MEMINFO_FWD_ALLOC ], + skmeminfo[SK_MEMINFO_WMEM_QUEUED ], + skmeminfo[SK_MEMINFO_OPTMEM ]); + }else if (tb[INET_DIAG_MEMINFO ]) {const struct inet_diag_meminfo *minfo =RTA_DATA (tb[INET_DIAG_MEMINFO ]); printf(" mem:(r%u,w%u,f%u,t%u)",@@ -1505,8 +1515,10 @@ static int tcp_show_netlink(struct filter *f, FILE *dump_fp, int socktype)memset (&req.r,0 ,sizeof (req.r));
misc/ss.c static int tcp_show_netlink(struct filter *f, FILE *dump_fp, int socktype) · line 1524
Quoted 10 lines
misc/ss.c +3
-1req.r.idiag_family =AF_INET ; req.r.idiag_states = f->states; -if (show_mem) +if (show_mem) { req.r.idiag_ext |= (1 <<(INET_DIAG_MEMINFO -1 )); + req.r.idiag_ext |= (1 <<(INET_DIAG_SKMEMINFO -1 )); + }if (show_tcpinfo) { req.r.idiag_ext |= (1 <<(INET_DIAG_INFO -1 ));
This looks good, is the skmeminfo a superset of the old meminfo? But your code is broken on 64 bit. skmeminfo in kernel is an array of __u32!
Quoted 55 lines · Stephen Hemminger
Quoted 52 lines · On Wed, 02 May 2012 17:45:02 +0800 Shan Wei <[email protected]> wrote:
Hi stephen:
Stephen Hemminger said, at 2012/4/28 1:21:
Quoted 2 lines
Lots of options return more or different information based on kernel version, probably the biggest example is how stats are processed.
how about the following patch?
----
[PATCH] ss: use newINET_DIAG_SKMEMINFOoption to get memory information for tcp socketSigned-off-by Shan Wei <[email protected]>--- misc/ss.c | 16 ++++++++++++++-- 1 files changed, 14 insertions(+), 2 deletions(-)misc/ss.c +14
-2@@ -1336,7 +1336,17 @@ static void tcp_show_info(const struct nlmsghdr *nlh, struct inet_diag_msg *r)parse_rtattr (tb,INET_DIAG_MAX , (struct rtattr *)(r+1 ), nlh->nlmsg_len -NLMSG_LENGTH (sizeof (*r))); -if (tb[INET_DIAG_MEMINFO ]) { +if (tb[INET_DIAG_SKMEMINFO ]) { +const unsigned int *skmeminfo =RTA_DATA (tb[INET_DIAG_SKMEMINFO ]); +printf (" skmem:(r%u,rb%u,t%u,tb%u,f%u,w%u,o%u)" , + skmeminfo[SK_MEMINFO_RMEM_ALLOC ], + skmeminfo[SK_MEMINFO_RCVBUF ], + skmeminfo[SK_MEMINFO_WMEM_ALLOC ], + skmeminfo[SK_MEMINFO_SNDBUF ], + skmeminfo[SK_MEMINFO_FWD_ALLOC ], + skmeminfo[SK_MEMINFO_WMEM_QUEUED ], + skmeminfo[SK_MEMINFO_OPTMEM ]); + }else if (tb[INET_DIAG_MEMINFO ]) {const struct inet_diag_meminfo *minfo =RTA_DATA (tb[INET_DIAG_MEMINFO ]); printf(" mem:(r%u,w%u,f%u,t%u)",@@ -1505,8 +1515,10 @@ static int tcp_show_netlink(struct filter *f, FILE *dump_fp, int socktype)memset (&req.r,0 ,sizeof (req.r)); req.r.idiag_family =AF_INET ; req.r.idiag_states = f->states; -if (show_mem) +if (show_mem) { req.r.idiag_ext |= (1 <<(INET_DIAG_MEMINFO -1 )); + req.r.idiag_ext |= (1 <<(INET_DIAG_SKMEMINFO -1 )); + }
Quoted 4 lines
misc/ss.c static int tcp_show_netlink(struct filter *f, FILE *dump_fp, int socktype) · line 1524
Quoted 2 lines
misc/ss.c +0
-0if (show_tcpinfo) { req.r.idiag_ext |= (1 <<(INET_DIAG_INFO -1 ));This looks good, is the skmeminfo a superset of the old meminfo?
In terms of the values it returns -- yes, but these two structures are not binary compatible to each other.
Quoted 1 line
But your code is broken on 64 bit. skmeminfo in kernel is an array of
__u32!
Hmm :( So is the inet_diag_meminfo, which was the prototype for the skmeminfo... Should we introduce the SKMEMINFO64?
Quoted 2 lines
.
Stephen Hemminger said, at 2012/5/3 3:00:
Quoted 2 lines
This looks good, is the skmeminfo a superset of the old meminfo?
Yes, skmeminfo is a superset of old meminfo. Using this can get more socket memory information.
Quoted 1 line
But your code is broken on 64 bit. skmeminfo in kernel is an array of
__u32!
OK. here is a new version.
----
[PATCH] ss: use new INET_DIAG_SKMEMINFO option to get more memory information for tcp socket
--- misc/ss.c | 16 ++++++++++++++-- 1 files changed, 14 insertions(+), 2 deletions(-)
misc/ss.c +14 -2
@@ -1336,7 +1336,17 @@ static void tcp_show_info(const struct nlmsghdr *nlh, struct inet_diag_msg *r)parse_rtattr (tb,INET_DIAG_MAX , (struct rtattr *)(r+1 ), nlh->nlmsg_len -NLMSG_LENGTH (sizeof (*r))); -if (tb[INET_DIAG_MEMINFO ]) { +if (tb[INET_DIAG_SKMEMINFO ]) { +const __u32 *skmeminfo =RTA_DATA (tb[INET_DIAG_SKMEMINFO ]); +printf (" skmem:(r%u,rb%u,t%u,tb%u,f%u,w%u,o%u)" , + skmeminfo[SK_MEMINFO_RMEM_ALLOC ], + skmeminfo[SK_MEMINFO_RCVBUF ], + skmeminfo[SK_MEMINFO_WMEM_ALLOC ], + skmeminfo[SK_MEMINFO_SNDBUF ], + skmeminfo[SK_MEMINFO_FWD_ALLOC ], + skmeminfo[SK_MEMINFO_WMEM_QUEUED ], + skmeminfo[SK_MEMINFO_OPTMEM ]); + }else if (tb[INET_DIAG_MEMINFO ]) {const struct inet_diag_meminfo *minfo =RTA_DATA (tb[INET_DIAG_MEMINFO ]); printf(" mem:(r%u,w%u,f%u,t%u)",
@@ -1505,8 +1515,10 @@ static int tcp_show_netlink(struct filter *f, FILE *dump_fp, int socktype)memset (&req.r,0 ,sizeof (req.r)); req.r.idiag_family =AF_INET ; req.r.idiag_states = f->states; -if (show_mem) +if (show_mem) { req.r.idiag_ext |= (1 <<(INET_DIAG_MEMINFO -1 )); + req.r.idiag_ext |= (1 <<(INET_DIAG_SKMEMINFO -1 )); + }if (show_tcpinfo) { req.r.idiag_ext |= (1 <<(INET_DIAG_INFO -1 ));
Signature · 1 line
1.7.1
Quoted 48 lines · On Thu, 03 May 2012 16:39:52 +0800 Shan Wei <[email protected]> wrote:
Stephen Hemminger said, at 2012/5/3 3:00:
Quoted 2 lines
This looks good, is the skmeminfo a superset of the old meminfo?
Yes, skmeminfo is a superset of old meminfo. Using this can get more socket memory information.
Quoted 1 line
But your code is broken on 64 bit. skmeminfo in kernel is an array of
__u32!OK. here is a new version.
----
[PATCH] ss: use newINET_DIAG_SKMEMINFOoption to get more memory information for tcp socketSigned-off-by Shan Wei <[email protected]>--- misc/ss.c | 16 ++++++++++++++-- 1 files changed, 14 insertions(+), 2 deletions(-)misc/ss.c +11
-1@@ -1336,7 +1336,17 @@ static void tcp_show_info(const struct nlmsghdr *nlh, struct inet_diag_msg *r)parse_rtattr (tb,INET_DIAG_MAX , (struct rtattr *)(r+1 ), nlh->nlmsg_len -NLMSG_LENGTH (sizeof (*r))); -if (tb[INET_DIAG_MEMINFO ]) { +if (tb[INET_DIAG_SKMEMINFO ]) { +const __u32 *skmeminfo =RTA_DATA (tb[INET_DIAG_SKMEMINFO ]); +printf (" skmem:(r%u,rb%u,t%u,tb%u,f%u,w%u,o%u)" , + skmeminfo[SK_MEMINFO_RMEM_ALLOC ], + skmeminfo[SK_MEMINFO_RCVBUF ], + skmeminfo[SK_MEMINFO_WMEM_ALLOC ], + skmeminfo[SK_MEMINFO_SNDBUF ], + skmeminfo[SK_MEMINFO_FWD_ALLOC ], + skmeminfo[SK_MEMINFO_WMEM_QUEUED ], + skmeminfo[SK_MEMINFO_OPTMEM ]); + }else if (tb[INET_DIAG_MEMINFO ]) {const struct inet_diag_meminfo *minfo =RTA_DATA (tb[INET_DIAG_MEMINFO ]); printf(" mem:(r%u,w%u,f%u,t%u)",@@ -1505,8 +1515,10 @@ static int tcp_show_netlink(struct filter *f, FILE *dump_fp, int socktype)memset (&req.r,0 ,sizeof (req.r));
misc/ss.c static int tcp_show_netlink(struct filter *f, FILE *dump_fp, int socktype) · line 1524
Quoted 10 lines
misc/ss.c +3
-1req.r.idiag_family =AF_INET ; req.r.idiag_states = f->states; -if (show_mem) +if (show_mem) { req.r.idiag_ext |= (1 <<(INET_DIAG_MEMINFO -1 )); + req.r.idiag_ext |= (1 <<(INET_DIAG_SKMEMINFO -1 )); + }if (show_tcpinfo) { req.r.idiag_ext |= (1 <<(INET_DIAG_INFO -1 ));
This looks good, I will apply it