1
hepochen 2014-06-14 14:58:40 +08:00 via iPhone 2
ss 这个系统命令是最高效的
|
2
dreampuf 2014-06-14 15:05:12 +08:00 1
https://github.com/giampaolo/psutil/blob/master/psutil/_pslinux.py#L362
自己改写逻辑?按时间倒排增量? psutil 只是解析 /proc/net/* 中的内容,以枚举器的形式返回。/proc 在内存中,IO问题相对来说没有disk那么严重 |
4
dreampuf 2014-06-14 15:27:50 +08:00
@Livid ss也是读取的/proc/net/中的统计信息。如果你不需要pid相关信息的话,我觉得psutil更易用更容易定制
|
5
liwei 2014-06-14 16:29:19 +08:00 via Android 2
@dreampuf 非也,netstat就是因为读取/proc目录的文件导致在大量链接的情况下速度不理想,ss正是为了改善这一状况而产生的,使用的是内核的 ip_diag和tcp_diag功能,走的是netlink接口。
|
8
dreampuf 2014-06-15 01:49:57 +08:00
@liwei
@est 多谢告知。感谢已送。 ss.c 里的统计信息似乎还是读取/proc/* 。是我下了错误的版本吗? $ uname -a Linux dt 3.11.0-12-generic #19-Ubuntu SMP Wed Oct 9 16:20:46 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux $ sudo apt-get source iproute ~/iproute2-3.12.0/misc$ grep -A13 'static FILE \*generic_proc_open' ss.c static FILE *generic_proc_open(const char *env, const char *name) { const char *p = getenv(env); char store[128]; if (!p) { p = getenv("PROC_ROOT") ? : "/proc"; snprintf(store, sizeof(store)-1, "%s/%s", p, name); p = store; } return fopen(p, "r"); } |
9
dreampuf 2014-06-15 02:04:29 +08:00
再看了眼,proc只有在netlink失败后才会作为备选方案解析。
static int tcp_show(struct filter *f, int socktype) { FILE *fp = NULL; char *buf = NULL; int bufsize = 64*1024; dg_proto = TCP_PROTO; if (getenv("TCPDIAG_FILE")) return tcp_show_netlink_file(f); if (!getenv("PROC_NET_TCP") && !getenv("PROC_ROOT") && inet_show_netlink(f, NULL, socktype) == 0) return 0; /* Sigh... We have to parse /proc/net/tcp... */ |