java so reuseport_强大的SO_REUSEPORT

一般来讲,一个(服务)进程listen了一个端口,如果重复启动,则会报端口被占用的错误,听起来也很合理。突然发现linux上出现了SO_REUSEPORT,似乎多个进程可以同时listen同一个端口。

测试脚本 server.php:

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

socket_set_option($socket, SOL_SOCKET, SO_REUSEPORT, 1);

socket_bind($socket, "127.0.0.1", 2345);

socket_listen($socket);

while($s = socket_accept($socket)) {

$str = socket_read($s, 2048, PHP_NORMAL_READ);

socket_write($s, posix_getpid().":".$str);

socket_close($s);

}

1

2

3

4

5

6

7

8

9

10

$socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);

socket_set_option($socket,SOL_SOCKET,SO_REUSEPORT,1);

socket_bind($socket,"127.0.0.1",2345);

socket_listen($socket);

while($s=socket_accept($socket)){

$str=socket_read($s,2048,PHP_NORMAL_READ);

socket_write($s,posix_getpid().":".$str);

socket_close($s);

}

注意:

centos7上如果是yum安装的php,则posix模块的安装方式是: yum install -y php-process  (这个名字不叫posix)

启动之后,如果用yum安装的nc来测试,会出现连接被refused的情况,这是因为centos7上的nc默认用的是tcp6(socket_create时使用AF_INET6),一个服务确定的是连接的3要素:协议、IP、端口;切记,tcp和tcp6是两种不同的协议 ; 解决办法:添加 -4选项,即: nc -4 localhost 2345

执行:

php server.php &

既然设置了SO_REUSEPORT,则应该可以再启动一个吧?结果,同时启动两个,则两个进程都被stop了

再看: 去掉 ‘&’ 来执行 php server.php   ,不放打开多个terminal,我这里打开了两个,发现两个进程都没有再停止了

再打开一个terminal,执行:

while :; do echo “hello”|nc -4 localhost 2345;done

输出里面混杂出现两个进程的pid,证明:两个进程在同时提供服务了;

b3a8db3824cdaee343f5cd4c86a80eab.png

注意: 即使是多个进程在提供服务,netstat中看到的却只有一个进程在listen

(mac下测试相同脚本,结果是: netstat中可以看到多个进程在listen,但是实际测试却只有一个进程在提供服务,反正我也不同mac来提供线上服务,这里就不研究mac了)

问题: 为什么我这个脚本不能推到后台执行????????

strace 跟踪发现,可能和标准输出有关系(这个应该也是centos7和前面版本的差异),把标准输出重定向走:

php server.php >/dev/null &

这样就不会停止了,之于标准错误、标准输入是否会有其他的影响,这个这里就不再研究了

总结:

SO_REUSEPORT 真心不错

参考资料:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值