[Bug] 是否考虑资源限制对 epoll管理socket存在问题

,

大致流程

test-backlog这个actix-web程序创建了两个进程(进程7和8),在进程7中创建了一个epoll(fd 3,添加了一个pipe和4个streamsocket),然后创建了一个tcpsocket(fd 7),listen和bind之后,调用系统调用clone 将进程7clone到进程8,在进程8中再创建一个epoll(fd 14)添加一个pipe和那个tcpsocket,然后进入epoll_wait

问题

当再外面请求一次时,将原来的tcpsocket(fd 7)添加进入epoll的ready_list,然后accpet创建一个新的socket(fd 17),这个socket也是需要被epoll_add的,但是没有,反而直接调epoll_ctl(delete)把原来的tcpsocket(fd 7)给delete了,随后新的socket(fd 17)也close了。

Accept创建的新的socket缺失epoll_ctrl(add)系统调用导致无法注册事件

在linux使用strace跟踪调用

使用了但没实现的系统调用或功能:

  1. /proc/self/cgroup功能 (将进程分组,并限制和监控这些组的资源使用情况,例如 CPU、内存、磁盘 I/O 和网络带宽等)

  1. Mmap中map_fixed对已有vma的覆盖

3.setsocketopt

4.sys_prctl

总结

  • epoll_ctl 的 EPOLL_CTL_ADD 调用缺失 会导致新创建的 socket 无法被 epoll 监控,因而无法响应任何事件。

  • cgroup 的资源限制 可能导致无法创建新的 socket 或将 socket 加入 epoll。

  • 系统调用的缺失或失败(如 epoll_ctl、prctl、mmap)可能会影响 socket 的正常操作。

3 个赞

(这也太详细惹):heart:

1 个赞

已知其 setsockopt 调用的是 SO_REUSEADDR , 按道理就不影响程序逻辑。

MAP_FIXED is dup2 for memory mappings, and it’s useful in exactly the same situations where dup2 is useful for file descriptors: when you want to perform a replace operation that atomically reassigns a resource identifier (memory range in the case of MAP_FIXED, or fd in the case of dup2) to refer to a new resource without the possibility of races where it might get reassigned to something else if you first released the old resource then attempted to regain it for the new resource.
c - When would one use mmap MAP_FIXED? - Stack Overflow

也就是说如果是这个问题,dup2 系统调用也要完善。

有没有可能是之前的系统调用失败,然后程序才delete掉对应的epitem呢,所以这个问题感觉得结合测试程序底层源码来看,因为前面某些功能缺失,用户程序完全有可能会主动调用epctl来释放资源。

因为epctl这个系统调用在我印象中内核似乎没有调用过,如果内核没有主动调用,那只能是用户程序因为前置系统调用失败而调用的epctl

1 个赞

在这个版本之后运行test-backlog程序在创建新的进程时会报错误vma access error


对内存管理不是特别了解,把map_anonymous()函数的allocate_at_once设成true就不会报这个错,请教一下可能是什么原因

那这个版本前呢?不报vma的话报啥错?

之前版本不报错,但是和把allocate_at_once设成true一样就那几个系统调用还没实现

@MemoryShore @Jomocool 麻烦看看这个咋回事哈哈哈

1 个赞

该问题已修复,见pr:

4 个赞