Linux 内核不处理孤立套接字,为什么不呢?

Linux 内核不处理孤立套接字,为什么不呢?

这最初发布到服务器故障但被社区投票为偏离主题。

让我在这个问题前先说一下我理解 Linux 内核套接字状态的原因/方式/地点/时间,并且我希望强制 Linux 内核针对我的特定应用程序和上下文以某种方式运行。

机器是运行 Raspbian 的 Pi 3 B+。

我的目标是遵循以下答案这个问题杀死处于“无用状态”*的套接字,所以我在Python中实现它,如下所示:

def kill_hanging_sockets(self):
    default_max_tcp_sockets = subprocess.check_output(['cat /proc/sys/net/ipv4/tcp_max_orphans'], shell=True)
    subprocess.call(['sudo bash -c "echo 0 > /proc/sys/net/ipv4/tcp_max_orphans"'], shell=True)
    new_max_tcp_sockets = subprocess.check_output(['cat /proc/sys/net/ipv4/tcp_max_orphans'], shell=True)
    print('new value is {}'.format(new_max_tcp_sockets))
    time.sleep(3)
    subprocess.call(['sudo bash -c "echo %s > /proc/sys/net/ipv4/tcp_max_orphans"' % default_max_tcp_sockets], shell=True)

该函数非常简单,它只是将值设置为 0 并打印该值以确保其为 0,等待三秒让内核“杀死”孤立套接字,然后将 max 参数设置回其原始值。

然而,它不起作用,套接字并没有像我想象的那样被内核“杀死”。看起来行为保持不变,并且套接字在 20 秒左右的时间内被“杀死”;我认为更改max_tcp_orpahns不会影响系统,或者有问题的套接字不会真正成为孤立套接字。

我检查使用的套接字sudo netstat --inet -p -c,它们仍然处于 FIN_WAIT 或 CLOSE_WAIT 状态,我试图阻止这种情况发生。我还有什么可以在这里尝试的,或者我是不是找错了树?

[*] 我对“无用状态”的定义可能与您或 Linux 内核的不同,但请考虑问题的上下文。在上述上下文中,套接字对我来说“无用”,因为我无法绑定另一个套接字,直到它们消失。

相关内容