yihong0618 和朋友们的频道 头像

消息来源频道

yihong0618 和朋友们的频道

@hyi0618

频道8,612 位成员公开可见0 人在线

yihong0618 和朋友们的频道

成员规模8,612 位成员
在线情况0 人在线
消息总数10,129 条消息
浏览量总数3,298,582 次浏览

在这个频道里搜索消息……

t.me/hyi0618

我在五月就赞美过 bpftrace v0.24.0 的 子函数 卫生宏 (https://t.me/c/1459082815/809) ,两周前 v0.24 终于发版了!我这就给大家表演一个探测指定用户态进程的 tcp socket 是否被 cwnd (congestion window) 限流的现代化 bpftrace 脚本📸
#define IPPROTO_TCP 6
#define AF_INET 2
macro fd_to_tcp_sk($fd, $task)
{
$fdt = curtask->files->fdt;
$file = (struct file )((uint64)($fdt->fd) + ((uint64)$fd 8));
$sk = (struct sock *)0;
if ($file && $file->private_data) {
$sock = (struct socket *)$file->private_data;
if ($sock->sk->sk_protocol == IPPROTO_TCP) {
$sk = (struct sock *)$sock->sk;
}
}
$sk
}
macro print_sk_addr($sk)
{
$fam = $sk->__sk_common.skc_family;
$sport = $sk->__sk_common.skc_num;
$dport = bswap($sk->__sk_common.skc_dport);
if ($fam == AF_INET) {
$saddr = $sk->__sk_common.skc_rcv_saddr;
$daddr = $sk->__sk_common.skc_daddr;
printf("IPv4 %s:%d -> %s:%d ", ntop($saddr), $sport, ntop($daddr), $dport);
}
}
profile:hz:9 /pid == $1/
{
$task = curtask;
for ($fd : 0..200) {
$sk = fd_to_tcp_sk($fd, $task);
if ($sk == 0) {
continue;
}
printf("fd=%d sk=%llx ", $fd, $sk);
print_sk_addr($sk);
$tcpsk = (struct tcp_sock *)$sk;
printf("packets_out=%d cwnd=%d is_cwnd_limited=%d\n", $tcpsk->packets_out, $tcpsk->snd_cwnd, $tcpsk->is_cwnd_limited);
}
}
示例输出
fd=4 sk=ffff909798dbd580 IPv4 10.30.22.130:58830 -> 10.1.1.1:5201 packets_out=0 cwnd=10 is_cwnd_limited=0
fd=5 sk=ffff909798dbf200 IPv4 10.30.22.130:58842 -> 10.1.1.1:5201 packets_out=18738 cwnd=20100 is_cwnd_limited=1
顺便预告我终于读懂了超级大鹅在三年前的 tcptrace 教学博客 (https://www.kawabangga.com/posts/4794) (已经过了三年了吗),tcptrace 和我不得不说的爱恨,尽在◾️ The Black Parade S2◾️