1.什么是无损迁移
平滑升级的本质就是 listener fd 的迁移.
那什么是fd,为什么fd不能直接传给进程呢?fd是针对进程的,fd只是一个数字,但是同样的数字对不同的进程有不同的意义.因此两个进程想同时监听同一个fd,有两种方法
1.新老进程是父子关系.
不知道是否有疑问.
两个进程同时监听一个端口,会发生什么
本质上,每个进程都会有一个打开文件的列表(lsof -p),每个打开的文件都会有一个文件描述符(ll proc/进程id/fd),fd代表了一个进程打开的某个特定文件.如图.socket也是一个文件(linux 万物皆文件).每个socket关联两个sk_buffer的队列,代表着收发队列.可以参考我之前的博客.(socket底层结构).
那么,有一个新连接后,如果两个进程都在accept,那么会把这个连接给哪个进程呢?当然是一视同仁,都告诉他们,但这样会导致惊群效应.还好现在的内核已经解决该问题了。多个进程都阻塞在对同一个socket的accept调用上时,当有一个新的连接到来,内核只会唤醒一个进程,其他进程保持休眠,压根就不会被唤醒.
2.通过sendfile来传递fd.
mosn中的无损迁移即通过sendMsg/recvMsg系统调用来搞的.