epoll

How to get errno when epoll_wait returns EPOLLERR?

女生的网名这么多〃 提交于 2019-12-03 06:08:58
Is there a way to find out the errno when epoll_wait returns EPOLLERR for a particular fd? Is there any further information about the nature of the error? Edit: Adding more information to prevent ambiguity epoll_wait waits on a number of file descriptors. When you call epoll_wait you pass it an array of epoll_event structures: struct epoll_event { uint32_t events; /* Epoll events */ epoll_data_t data; /* User data variable */ }; The epoll_data_t structure has the same details as the one you used with epoll_ctl to add a file descriptor to epoll: typedef union epoll_data { void *ptr; int fd;

select,iocp,epoll,kqueue及各种I/O复用机制

大憨熊 提交于 2019-12-03 06:07:29
首先,介绍几种常见的I/O模型及其区别 ,如下: blocking I/O nonblocking I/O I/O multiplexing (select and poll) signal driven I/O (SIGIO) asynchronous I/O (the POSIX aio_functions) blocking I/O 这个不用多解释吧,阻塞套接字。下图是它调用过程的图示: 重点解释下上图,下面例子都会讲到。首先application调用 recvfrom()转入kernel,注意kernel有2个过程,wait for data和copy data from kernel to user。直到最后copy complete后,recvfrom()才返回。此过程一直是阻塞的。 nonblocking I/O: 与blocking I/O对立的,非阻塞套接字,调用过程图如下: 可以看见,如果直接操作它,那就是个轮询。。直到内核缓冲区有数据。 I/O multiplexing (select and poll) 最常见的I/O复用模型,select。 select先阻塞,有活动套接字才返回。与 blocking I/O 相比,select会有两次系统调用,但是select能处理多个套接字。 signal driven I/O (SIGIO) 只有UNIX系统支持

13倍性能,3倍稳定性提升!UCloud云硬盘做了这些事

…衆ロ難τιáo~ 提交于 2019-12-03 05:28:33
近期,我们推出高性能SSD云盘,满足用户对高性能的场景需求。SSD云盘相比普通云盘,IOPS提升了13倍,稳定性提升了3倍,平均时延降低了10倍。为了做到这些,我们从去年10月份开始对云盘的架构进行了重新设计,充分减少时延和提升IO能力;并通过复用部分架构和软件,提供性能更好、更稳定的普通云盘;同时逐步引入Stack/Kernel Bypass技术,打造下一代超高性能存储。新架构推出后,已服务了现网用户的3400多个云盘实例,总存储容量达800 TB,集群每秒IOPS均值31万。 架构升级要点 通过对现阶段问题和需求的分析,我们整理了这次架构升级的具体要点: 1 、解决原有软件架构不能充分发挥硬件能力的局限 2 、支持SSD云盘,提供QOS保证,充分发挥后端NVME物理盘的IOPS和带宽性能,单个云盘IOPS可达2.4W 3 、支持更大容量云盘,32T甚至更大 4 、充分降低IO流量的热点问题 5 、支持并发创建几千块云盘,支持并发挂载几千块云盘 6 、支持老架构云盘在线向新架构迁移,支持普通云盘在线迁移至SSD云盘 新架构改造实践 改造一:IO路径优化 老架构中,整个IO路径有三大层,第一层宿主Client侧,第二层Proxy侧,第三层存储Chunk层。Proxy负责IO的路由获取以及缓存;IO的读写转发到下一层存储层,负责IO写三份复制。 而新架构中,路由获取交给了Client

Multithreading UDP server with epoll?

主宰稳场 提交于 2019-12-03 05:20:18
问题 I'd like to develop a multithreaded UDP server in C/Linux. The service is running on a single port x, thus there's only the possibility to bind a single UDP socket to it. In order to work under high loads, I have n threads (statically defined), say 1 thread per CPU. Work could be delivered to the thread using epoll_wait, so threads get woken up on demand with 'EPOLLET | EPOLLONESHOT'. I've attached a code example: static int epfd; static sig_atomic_t sigint = 0; ... /* Thread routine with

With a single file descriptor, Is there any performance difference between select, poll and epoll and …?

送分小仙女□ 提交于 2019-12-03 05:10:28
问题 The title really says it all. The and ... means also include pselect and ppoll.. The server project I'm working on basically structured with multiple threads. Each thread handles one or more sessions. All the threads are identical. The protocol takes care of which thread will host the session. I'm using an inhouse socket class that wraps things up. The point of interest is a checkread call which calls either poll (linux) or select (windows). In summary each thread currently calls poll on a

How do I use EPOLLHUP

為{幸葍}努か 提交于 2019-12-03 02:51:50
问题 Could you guys provide me a good sample code using EPOLLHUP for dead peer handling? I know that it is a signal to detect a user disconnection but not sure how I can use this in code..Thanks in advance.. 回答1: You use EPOLLRDHUP to detect peer shutdown, not EPOLLHUP (which signals an unexpected close of the socket, i.e. usually an internal error). Using it is really simple, just "or" the flag with any other flags that you are giving to epoll_ctl . So, for example instead of EPOLLIN write

Redis 基础

匿名 (未验证) 提交于 2019-12-03 00:44:02
基本类型 String,hash,list,set,sorted set(zset) 安装 按照README的安装步骤进行 架构原理 redis单进程,单线程,并发很多的请求,如何变得很快的呢?? 当我们使用多个redis-cli进行连接的时候,我们首先对通过redis-cli连接到了linux kernel,linux kernel自带一个epoll的调用,我们在使用redis服务端去调用linux的系统内核,调用epoll。 啥是epoll? 早期的bio时期 。内核有一个跃迁,变化的过程,socket中的fd可以是nonblock的。如果有1000fd,代表用户进程轮询用1000次kernel的成本问题。于是内核更新新的调用,叫做select,实现多路复用的NIO。之后又进行了一次迭代更新,我们kernel更新mmap,我们系统开放了一个虚拟的共享空间,可以供用户调用。 mmap? 在mmap的共享空间,我们使用红黑树+链表(共享空间并非零拷贝,零拷贝是sendfile),mmap还在kafka中有实际运用 2.使用help进行查询(自带补齐功能) help @string可以查询 3.使用type查看类型 type K 4.set是string类型的,所以使用set的全部为string 5.incr和decr可以加减int的编码类型 i 来源:博客园 作者:

I/O多路转接---epoll服务器

匿名 (未验证) 提交于 2019-12-03 00:26:01
epoll是改进的poll,几乎结合了poll的所有优点,并将poll的缺点加以改进,被公认为Linux2.6下性能最好的多路I/O就绪通知方法。 红黑树结点内容,保存了用户想要告诉操作系统要监控的哪些文件描述符上的哪些事件。 回调机制不需要操作系统一直在等,在事件就绪时,驱动会告诉操作系统,有事件就绪了,操作系统就会处理眼前的事件。这个回调机制在内核中称为epollcallback,它将发生的事件添加到rdlist 在事件就绪后,操作系统将对应的文件描述符上的事件的结点放在就绪队列中,由用户检查就绪队列,来判断是否有事件就绪。 如下图所示: epoll_create #include <sys/epoll.h> int epoll_create( int size); 功能:创建一个epoll的句柄。(即创建epoll模型) 说明: * 从Linux2.6.8之后,size参数是被忽略的。 * 使用完后,必须调用close()关闭。 epoll_ctl #include <sys/epoll.h> int epoll_ctl( int epfd, int op, int fd, struct epoll_event * event ); 功能:epoll的事件注册函数。 说明: * 在监听事件前,要先注册监听什么类型的事件. * 第一个参数epfd是epoll的句柄. *

如何提高服务器并发处理能力

匿名 (未验证) 提交于 2019-12-03 00:22:01
什么是服务器并发处理能力 一台服务器在单位时间里能处理的请求越多,服务器的能力越高,也就是服务器并发处理能力越强 有什么方法衡量服务器并发处理能力 1. 吞吐率 吞吐率,单位时间里服务器处理的最大请求数,单位req/s 从服务器角度,实际并发用户数的可以理解为服务器当前维护的代表不同用户的文件描述符总数,也就是并发连接数。服务器一般会限制同时服务的最多用户数,比如apache的MaxClents参数。 这里再深入一下,对于服务器来说,服务器希望支持高吞吐率,对于用户来说,用户只希望等待最少的时间,显然,双方不能满足,所以双方利益的平衡点,就是我们希望的最大并发用户数。 2. 压力测试 有一个原理一定要先搞清楚,假如100个用户同时向服务器分别进行10个请求,与1个用户向服务器连续进行1000次请求,对服务器的压力是一样吗?实际上是不一样的,因对每一个用户,连续发送请求实际上是指发送一个请求并接收到响应数据后再发送下一个请求。这样对于1个用户向服务器连续进行1000次请求, 任何时刻服务器的网卡接收缓冲区中只有1个请求,而对于100个用户同时向服务器分别进行10个请求,服务器的网卡接收缓冲区最多有100个等待处理的请求,显然这时的服务器压力更大。 压力测试前提考虑的条件 并发用户数: 指在某一时刻同时向服务器发送请求的用户总数(HttpWatch) 总请求数 请求资源描述

关于tcp连接10k和10m问题测试及问题解决

匿名 (未验证) 提交于 2019-12-03 00:21:02
今天准备写一下epoll_timer(即epoll实现的简单定时器, 后面会分享blog)由于用到epoll的模型,翻出原先的代码跑了一下,看到原来define的最大的处理用户上限,感觉有些不妥,所以决定测试一下我的ubuntu 16.04,1G内存的单机上究竟可以建立多少个连接。虽然网上有很多这方面的案例,但是我还是决定自己测试一下,印象深刻,对问题场景有更深的印象。 如果文中有错误或者不全面的地方,希望大家指正。 我测试代码是自己写的,也很简单,就是客户端程序不停的请求连接(这里都是短链接,长连接和需要数据交互的连接请求情况可能和本文的情况不同),服务器接收了客户端的请求建立连接,这种情况下,客户端不停的创建socket描述符,起初我的系统设置的上限是1024(ulimit -n查看)。 测试程序代码: #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> #include <netinet/in.h> #include <errno.h> #include <arpa/inet.h> #include <string.h> #include <signal.h> #include <sys/wait.h> #define