精华内容
下载资源
问答
  • go_reuseport, 将SO_REUSEPORT带到你 GO_REUSEPORT GO_REUSEPORT 是一个小 expirement,用于创建支持 SO_REUSEPORT 套接字选项的net.Listener 。目前,Darwin和 Linux ( 从 3.9 ) 系统
  • Implement SO_REUSEPORT

    2020-12-09 01:27:49
    Basically, SO_REUSEPORT allows you to bind an arbitrary number of sockets to exactly the same source address and port as long as all prior bound sockets also had SO_REUSEPORT set before they were ...
  • nginx启用reuseport

    千次阅读 2020-05-15 09:55:43
    测试结果发现服务器nginx的cpu利用率恨不均匀,后来查到有reuseport这个参数,放在listen后面 listen 80 default_server reuseport; 增了了试验了下,果然好用。 下图是对比,上面是不开启reuseport,可以看到cpu...

    这两天做一个http测试,客户端使用一台8核16G的虚机,服务器使用8台8核16G的虚机,服务器挂在负载均衡后端。
    客户端使用wrk打流
    服务器开启nginx,返回 200 ok
    测试结果发现服务器nginx的cpu利用率恨不均匀,后来查到有reuseport这个参数,放在listen后面

    listen 80 default_server reuseport;

    增了了试验了下,果然好用。
    下图是对比,上面是不开启reuseport,可以看到cpu利用率在20-40%,而开启了,cpu利用率只有12%了。
    http请求
    在这里插入图片描述
    https请求
    在这里插入图片描述

    我的测试机器安装

    [root@vm100-0-11-135 ~]# rpm -qa|grep nginx
    nginx-mod-stream-1.16.1-1.el7.x86_64
    nginx-1.16.1-1.el7.x86_64
    nginx-filesystem-1.16.1-1.el7.noarch
    nginx-mod-http-perl-1.16.1-1.el7.x86_64
    nginx-mod-http-xslt-filter-1.16.1-1.el7.x86_64
    nginx-mod-http-image-filter-1.16.1-1.el7.x86_64
    nginx-mod-mail-1.16.1-1.el7.x86_64
    nginx-all-modules-1.16.1-1.el7.noarch
    [root@vm100-0-11-135 ~]# nginx -V
    nginx version: nginx/1.16.1
    built by gcc 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC) 
    built with OpenSSL 1.0.2k-fips  26 Jan 2017
    TLS SNI support enabled
    configure arguments: --prefix=/usr/share/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --http-client-body-temp-path=/var/lib/nginx/tmp/client_body --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --pid-path=/run/nginx.pid --lock-path=/run/lock/subsys/nginx --user=nginx --group=nginx --with-file-aio --with-ipv6 --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-stream_ssl_preread_module --with-http_addition_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_slice_module --with-http_stub_status_module --with-http_perl_module=dynamic --with-http_auth_request_module --with-mail=dynamic --with-mail_ssl_module --with-pcre --with-pcre-jit --with-stream=dynamic --with-stream_ssl_module --with-google_perftools_module --with-debug --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -specs=/usr/lib/rpm/redhat/redhat-hardened-cc1 -m64 -mtune=generic' --with-ld-opt='-Wl,-z,relro -specs=/usr/lib/rpm/redhat/redhat-hardened-ld -Wl,-E'
    
    展开全文
  • fix reuseport bug

    2020-11-28 05:41:21
    <div><p>When using REUSEPORT udp socket and bind using API srt_bind_acquire, it always choose the first CMultiplexer.</p><p>该提问来源于开源项目:Haivision/srt</p></div>
  • Linux的socket reuseport与eBPF

    千次阅读 2019-11-25 22:33:30
    最开始,Linux协议栈并没有完全兼容BSD的reuseport语义,也就是说,Linux 3.9之前,所谓的reuseport仅仅有socket热备份功能,没有socket负载均衡功能,但是很快在3.9内核之后,Linux协议栈的reuseport功能便完善了:...

    今天晚上和小小一起学习,上个晚自习。


    已经是reuseport骨灰级玩家了,所以简单写。

    最开始,Linux协议栈并没有完全兼容BSD的reuseport语义,也就是说,Linux 3.9之前,所谓的reuseport仅仅有socket热备份功能,没有socket负载均衡功能,但是很快在3.9内核之后,Linux协议栈的reuseport功能便完善了:

    1. Active-Backup
    2. Active-Active

    最开始的 Active-Active 实现非常Low,自己看代码就知道了,必须遍历所有的socket,计算hash,才能选出工作socket,如果系统的Listener(TCP的,或者UDP的,比如DNS)非常多,那么socket lookup将会成为热点,徒耗CPU。

    而后,在Linux 4.6,事情起了变化,改成了取模算法,详见:
    https://blog.csdn.net/dog250/article/details/80458669

    增加了eBPF的支持,看起来很棒,但是好用吗?不一定。

    比如,我想实现一致性哈希,Linux 4.6版本的reuseport调用eBPF很难吧。即便实现一个最简单的一致性哈希,为了简洁,我也首选kpatch这类hotfix方案,而不是去写一个eBPF程序。以下是我的一致性哈希的代码:
    https://blog.csdn.net/dog250/article/details/89268404
    然而,如何用一种更加优雅的方案去促成这件事呢?

    等吧。


    终于,在eBPF的大潮下,我们迎来了 BPF_PROG_TYPE_SK_REUSEPORT ,这是又一个新增的eBPF的HOOK点,当reuseport逻辑选择socket的时候,该类型的eBPF程序被调用,最终的效果是:

    • 给定一个数据包skb,该HOOK点的eBPF程序会为该skb选择一个处理它的socket。

    先花一两分钟浏览下面的链接:
    https://lwn.net/Articles/762101/
    https://github.molgen.mpg.de/donald/linux/commit/8217ca653ec601246832d562207bc24bdf652d2f
    它们交代了这个eBPF的HOOK点的来龙去脉。

    reuseport这个HOOK点的eBPF程序依托两层嵌套的map:
    在这里插入图片描述

    首先,数据包根据元数据map到一个内层的reuseport map,该内层的map以数据包的内容为key,map到特定的socket。

    有点意思,不是吗?

    若要写代码,也不难,我这里没时间搞了,小小已经睡着了,我也要睡了,不过还是给出一个未完成的demo:

    struct {
    	__uint(type, BPF_MAP_TYPE_ARRAY_OF_MAPS);
    	__uint(max_entries, 1);
    	__uint(key_size, sizeof(__u32));
    	__uint(value_size, sizeof(__u32));
    } outer_map SEC(".maps");
    
    struct {
    	__uint(type, BPF_MAP_TYPE_ARRAY);
    	__uint(max_entries, NR_RESULTS);
    	__type(key, __u32);
    	__type(value, __u32);
    } result_map SEC(".maps");
    
    SEC("select_by_skb_data")
    int _select_by_skb_data(struct sk_reuseport_md *reuse_md)
    {
    	__u32  index = 0, flags = 0, dummy = 0, key = 0;
    	void *data, *data_end;
    	void *reuseport_array;
    	enum result result;
    	struct udphdr *uh;
    	int err;
    
    	data = reuse_md->data;
    	data_end = reuse_md->data_end;
    
    	if (reuse_md->eth_protocol != bpf_htons(ETH_P_IP))
    		return SK_PASS;
    
    	if (reuse_md->ip_protocol != IPPROTO_UDP)
    		return SK_PASS;
    
    	uh = data;
    
    	if (uh + 1 > data_end)
    		return SK_PASS;
    
    	// 仅仅一个reuseport组而已
    	reuseport_array = bpf_map_lookup_elem(&outer_map, &dummy);
    	if (!reuseport_array)
    		return SK_DROP;
    	
    	// ... key的获取过程,略!
    	// key计算自数据包内容
    	err = bpf_sk_select_reuseport(reuse_md, reuseport_array, &key, flags);
    	if (err)
    		return SK_DROP;
    
    	return SK_PASS;
    }
    
    char _license[] SEC("license") = "GPL";
    

    如果想知道更加详细的信息,请自行debug内核源码树的下面的文件:

    linux-source-5.3.0/tools/testing/selftests/bpf/progs/test_select_reuseport_kern.c
    linux-source-5.3.0/tools/testing/selftests/bpf/test_select_reuseport.c
    

    自诩reuseport,Netfilter/iptables,eBPF/XDP骨灰级玩家,欢迎志同道合者周末一起玩耍,然而也有我不会,不擅长的,比如DPDK,FPGA,Golang,数据库等,等等等等。


    浙江温州皮鞋湿,下雨进水不会胖!

    展开全文
  • SO_REUSEPORT

    2017-12-09 09:49:28
    以前就在国外的论坛接触过SO_REUSEPORT,这两天朋友群又在传播nginx 1.9  reuseport多进程监听参数。那咱们简单说下SO_REUSEPORT的应用场景, 为什么会用他? 然而在讲解SO_REUSEPORT之前,需要先说下我们常用的...

    int
    evutil_make_listen_socket_reuseable_port(evutil_socket_t sock)
    {
    #if defined __linux__ && defined(SO_REUSEPORT)
        int one = 1;
        /* REUSEPORT on Linux 3.9+ means, "Multiple servers (processes or
         * threads) can bind to the same port if they each set the option. */
        return setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, (void*) &one,
         (ev_socklen_t)sizeof(one));
    #else
        return 0;
    #endif
    }


    以前就在国外的论坛接触过SO_REUSEPORT,这两天朋友群又在传播nginx 1.9 reuseport多进程监听参数。那咱们简单说下SO_REUSEPORT的应用场景, 为什么会用他? 然而在讲解SO_REUSEPORT之前,需要先说下我们常用的网络模型。

    文章写得不太严谨, 请砖家拍砖,另外标注下原文地址,  http://xiaorui.cc/?p=2413


    在多核时代,一般主流的web服务器都使用 SO_REUSEADDR模式。 以下是比较典型的多进程/多线程服务器模型。


    首先需要单线程listen一个端口上,然后由多个工作进程/线程去accept()在同一个服务器套接字上。 


    第一个性能瓶颈,单线程listener,在处理高速率海量连接时,一样会成为瓶颈

    第二个性能瓶颈,多线程访问server socket锁竞争严重。

    那么怎么解决? 这里先别扯什么分布式调度,集群xxx的 , 就拿单机来说问题。在Linux kernel 3.9带来了SO_REUSEPORT特性,她可以解决上面(单进程listen,多工作进程accept() )的问题.


    看图说话,对比SO_REUSADDR的模型,我想你应该看懂SO_REUSEPORT是个什么东西了。  SO_REUSEPORT是支持多个进程或者线程绑定到同一端口,提高服务器程序的吞吐性能,具体来说解决了下面的几个问题:

    允许多个套接字 bind()/listen() 同一个TCP/UDP端口
    每一个线程拥有自己的服务器套接字
    在服务器套接字上没有了锁的竞争,因为每个进程一个服务器套接字
    内核层面实现负载均衡
    安全层面,监听同一个端口的套接字只能位于同一个用户下面

    我这边用python做了一个关于python SO_REUSEPORT服务端测试.   测试之前,已经要确定你的linux内核版本是3.9, 在mac下进行so_reuseport测试,貌似不会提示端口被绑定,但是后启动的进程会阻塞.

    file: reuseport.py

    开始测试reuseport.py 

    使用nc测试

    有些文章说,在python下多进程绑定同一个端口,也就是有人常说的prefork,他其实也是单个进程去listen监听端口,剩余的worker去accept获取用户请求而已.  如果想用python实现真正的多进程绑定在多一个端口,那只能是用so_reuseport模式 。 

    其实用python开发支持SO_REUSEPORT的服务端有个大好处,不用写多进程,多线程了..   算是一个偷懒的方法。 我自己觉得python离SO_REUSEPORT真实提高socket性能的应用场景比较的远,就python这性能….倒是可以迅速的提高socket开发效率..      


    另外标注下,SO_REUSEADDR和SO_REUSEPORT的区别:
    SO_REUSEADDR提供如下四个功能:
        SO_REUSEADDR允许启动一个监听服务器并捆绑其众所周知端口,即使以前建立的将此端口用做他们的本地端口的连接仍存在。这通常是重启监听服务器时出现,若不设置此选项,则bind时将出错。
        SO_REUSEADDR允许在同一端口上启动同一服务器的多个实例,只要每个实例捆绑一个不同的本地IP地址即可。对于TCP,我们根本不可能启动捆绑相同IP地址和相同端口号的多个服务器。
        SO_REUSEADDR允许单个进程捆绑同一端口到多个套接口上,只要每个捆绑指定不同的本地IP地址即可。这一般不用于TCP服务器。
        SO_REUSEADDR允许完全重复的捆绑:当一个IP地址和端口绑定到某个套接口上时,还允许此IP地址和端口捆绑到另一个套接口上。一般来说,这个特性仅在支持多播的系统上才有,而且只对UDP套接口而言(TCP不支持多播)。
    SO_REUSEPORT选项有如下语义:
        此选项允许完全重复捆绑,但仅在想捆绑相同IP地址和端口的套接口都指定了此套接口选项才行。
        如果被捆绑的IP地址是一个多播地址,则SO_REUSEADDR和SO_REUSEPORT等效。
    展开全文
  • 现象: 用ss -tnpl 'sport = :80' 命令,发现对于...2. 搜索代码发现在ngx_event_module中,对reuseport的端口做了特殊处理,如果是reuseport的端口,那么就给每个worker进程都复制一份,在ngx_open_listening_socke.

    现象:

    用ss -tnpl 'sport = :80' 命令,发现对于同一个IP+Port,一个进程内会有多个fd与之对应。

    经过修改listen 指令的参数发现是reuseport导致的。

     

    调试

    1. Gdb 调试worker进程发现listening数组中的端口被复制了。

    2. 搜索代码发现在ngx_event_module中,对reuseport的端口做了特殊处理,如果是reuseport的端口,那么就给每个worker进程都复制一份,在ngx_open_listening_sockets的时候,每个worker进程就都有了。

    原因

    具体原因见https://trac.nginx.org/nginx/changeset/7315/nginx。在这之前的版本

     

    1. 如果worker_processes指令在listen ..reuseport之后被解析,那么这个连接就不会被克隆到worker进程中。

    2. 这也简化了接下来的worker connections数目的检查,因为它也需要知道在clone之前的监听套接字个数。

    基于这两点,就在event模块对reuseport的端口进行了clone。

    展开全文
  • nginx源码分析—reuseport的使用

    千次阅读 2019-06-13 21:08:35
    本文主要介绍nginx中reuseport的使用,文中代码较多,阅读本文需要读者对nginx的事件模块以及listen配置过程有了解。 由于nginx比较复杂,且作者对nginx的理解有限,文章难免存在疏忽之处,敬请指出! 一、reuseport...
  • SO_REUSEPORT support

    2021-01-12 09:36:35
    I tested SO_REUSEPORT on go-dns using: <p>https://gist.github.com/chantra/dfab011267be22989b25134537963e5c</p> <p>To test, I patched <code>reflect</code> with ...
  • 关于SO_REUSEPORT的问题

    2020-12-09 11:19:55
    <div><p>使用了reuse_port=True 起了8个worker进程 但是 netstat -tunlp的...是不是SO_REUSEPORT没有效果,还是哪有什么问题?</p><p>该提问来源于开源项目:Thriftpy/gunicorn_thrift</p></div>
  • NGINX release 1.9.1 introduces a new feature that enables use of the SO_REUSEPORT  https://www.nginx.com/blog/socket-sharding-nginx-release-1-9-1/ http://forum.nginx.org/read.php?29,252762,25340
  • 关于Linux UDP/TCP reuseport 二三事

    万次阅读 2018-05-26 08:19:23
    聊到reuseport,大致要从四年前说起。 OpenVPN-以往的故事 当时要优化OpenVPN的并发性能,了解到socket有一个reuseport特性,于是非常兴奋,本着拿来主义的想法,无非就是在OpenVPN的源码里加一个setsockopt吧…...
  • Do not use SO_REUSEPORT

    2020-12-08 18:52:28
    <p>Hello, When running with a recent enough version of Python to have <code>socket.SO_REUSEPORT</code> but not a recent enough kernel to support that, we get this error in the logs: <p>Thu, 18 Jul ...
  • SO_REUSEPORT选项在Linux 3.9被引入内核,在这之前也有一个很像的选项SO_REUSEADDR。如果你不太清楚这两者的区别和联系,建议阅读How do SO_REUSEADDR and SO_REUSEPORT differ?。 如果不想读,那么下面这一节算是为...
  • <div><p>Should wait for Go 1.11 is released. 578 lines of this (95%) of this are test cases.</p><p>该提问来源于开源项目:libp2p/go-reuseport</p></div>
  • How to set SO_REUSEPORT

    2021-01-11 05:41:22
    ve encountered another issue in our server project: We need to set SO_REUSEPORT. We already use endpoint:set_reuse_addr(true) with our TCP server (SOCK_STREAM), which partially helps. To solve the ...
  • Add SO_REUSEPORT for Android

    2020-11-23 08:57:38
    <div><p>The <code>net2</code> crate currently fails to cross-compile to Android with <code>error: unresolved name</code>libc::SO_REUSEPORT`` <p>According to ...
  • Add support for SO_REUSEPORT

    2020-11-26 23:43:25
    <div><p>SO_REUSEPORT allows multiple applications to listen on the same address/port. This allows multiple pgbouncer instances to be started on the one server and have the operating system load ...
  • According this answer REUSEPORT will work on linux starting with 3.9 kernel version(which was released back in 2013 so we are OK) <p>Old workaround: ...
  • <div><p>this will avoid the need to bind each carbon process to ...<p>patches are on their way to support reuseport directly in twisted</p><p>该提问来源于开源项目:graphite-project/carbon</p></div>
  • This pull request conditionally compiles uses of the SO_REUSEPORT constants so that if an application is written to call set_reuseport(...) or reuseport() socket2-rs will compile on a Solaris based ...
  • 大家从来都没质疑过reuseport说明大家都不在乎reuseport。既然大家都不在乎,那我就来说说大家都不在乎的东西。大家都不管其实不是大家都不管,并不是大家觉得这很牛逼,实际上,真正使用这个机制的公司或者个人,...
  • <div><p>FreeBSD 12, which is scheduled to be released soon, has a new socket option SO_REUSEPORT_LB. From setsockopt man page: SO_REUSEPORT_LB allows completely duplicate bindings by multiple ...
  • <div><pre><code>so-reuseport: yes </code></pre> <p>See https://forum.opnsense.org/index.php?topic=18855.0</p><p>该提问来源于开源项目:opnsense/core</p></div>
  • <div><p>Using SO_REUSEPORT allows to quickly kill the server via SIGINT, SIGTERM or SIGKILL and start it again, without waiting for the OS to close the socket by timeout. <p>Closes #804 (for the ...
  • SO_REUSEPORT'): # NOTE(zhengwei): linux kernel >= 3.9 > sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1) E OSError: [Errno 22] Invalid argument </code></pre> <p>Tested on ...
  • so_reuseport' socket option, which allows multiple nginx worker process to listen to port 80 and 443 at the same time. The kernel can offload connections faster and bypasses queueing, which in ...
  • <p>This PR enables SO_REUSEPORT on the SSF listener if we're configured to run multiple listeners already. This isn't perfect, but it's a reasonable proxy for SO_REUSEPORT'ing. <h4>...
  • <div><ol><li>Upgrade tentacle</li><li>Enable reuse port on unix, Windows system has permission problems, it cannot be turned on by default</li><li>The discovery protocol version number has been ...
  • google linux kernel tcp reuseport patch

    千次阅读 2015-07-25 08:57:46
    This patch implements so_reuseport (SO_REUSEPORT socket option) forTCP and UDP.  For TCP,so_reuseport allows multiple listener socketsto be bound to the same port. In the case of UDP, so_reusepor

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,441
精华内容 576
关键字:

reuseport