epoll

Apache和Nginx对比

佐手、 提交于 2019-12-06 01:42:15
Apache和Nginx对比 功能对比 Nginx和Apache一样,都是HTTP服务器软件,在功能实现上都采用模块化结构设计,都支持通用的语言接口,如PHP、Perl、Python等,同时还支持正向和反向代理、虚拟主机、URL重写、压缩传输、SSL加密传输等。 在功能实现上,Apache的所有模块都支持动、静态编译,而Nginx模块都是静态编译的, 对FastCGI的支持,Apache对Fcgi的支持不好,而Nginx对Fcgi的支持非常好; 在处理连接方式上,Nginx支持epoll,而Apache却不支持; 在空间使用上,Nginx安装包仅仅只有几百K,和Nginx比起来Apache绝对是庞然大物。 Nginx相对apache的优点 轻量级,同样起web 服务,比apache 占用更少的内存及资源 静态处理,Nginx 静态处理性能比 Apache 高 3倍以上 抗并发,nginx 处理请求是异步非阻塞的,而apache则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能。在Apache+PHP(prefork)模式下,如果PHP处理慢或者前端压力很大的情况下,很容易出现Apache进程数飙升,从而拒绝服务的现象。 高度模块化的设计,编写模块相对简单 社区活跃,各种高性能模块出品迅速啊 apache相对nginx的优点 rewrite,比nginx 的rewrite

好文收集之Redis : 面试题

我只是一个虾纸丫 提交于 2019-12-06 01:12:47
面试 = 水平测试,并不是面试官要为难你,是要确定你的水平 天下无难试之Redis面试刁难大全 这几个题,讲的很全面,言简意赅。并且对问题有深度。 Redis有哪些数据结构? 使用过Redis分布式锁么,它是什么回事? 假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来? 使用过Redis做异步队列么,你是怎么用的? 如果有大量的key需要设置同一时间过期,一般需要注意什么? Redis如何做持久化的? Pipeline有什么好处,为什么要用pipeline? Redis的同步机制了解么? 是否使用过Redis集群,集群的原理是什么?有哪几种集群方式?各有什么好坏? Redis是单线程还是多线程? Redis 可以处理的并发量? Redis 为什么那么快? 纯内存操作 I/O 多路复用 I/O多路复用技术(multiplexing)是什么? 专门针对I/O多路复用技术做了了解,因为对Linux底层技术不了解,这里有个例子,算是明白了I/O多路复用是干嘛的了。 ========= 下面举一个例子,模拟一个tcp服务器处理30个客户socket。假设你是一个老师,让30个学生解答一道题目,然后检查学生做的是否正确,你有下面几个选择: 第一种选择:按顺序逐个检查,先检查A,然后是B,之后是C、D。。。这中间如果有一个学生卡主

How do I check client connection is still alive

徘徊边缘 提交于 2019-12-06 00:27:58
I am working on a network programming using epoll. I have a connection list and put every client in the list. I can detect user disconnection by reading 0 if the user disconnected normally. However, if the user somehow got disconnected unexpectedly then there is no way it knows about this until it tries send data to the user. I don't think epoll provides a nice way to handle this..so I think I should handle this on my own. I will be very appreciated if you guys can provide me anything like examples or references related to this problem. epoll_wait will return a EPOLLHUP or EPOLLERR for the

epoll_wait fails due to EINTR, how to remedy this?

余生颓废 提交于 2019-12-05 23:39:47
My epoll_wait fails due to EINTR. My gdb trace shows this: enter code here 221 in ../nptl/sysdeps/pthread/createthread.c (gdb) 224 in ../nptl/sysdeps/pthread/createthread.c (gdb) [New Thread 0x40988490 (LWP 3589)] 227 in ../nptl/sysdeps/pthread/createthread.c (gdb) epoll_wait error in start timer: Measurement will befor entire duration of execution epoll_wait: Interrupted system call [Thread 0x40988490 (LWP 3589) exited] This string "epoll_wait error in start timer: Measurement will befor entire duration of execution" is printed by me in stderr. I am not able to make out, how to remedy this

epoll_wait: maxevents

China☆狼群 提交于 2019-12-05 18:14:47
问题 int epoll_wait(int epfd, struct epoll_event *events, int maxevents, int timeout); I'm a little confused about the maxevents parameter. Let's say I want to write a server that can handle up to 10k connections. Would I define maxevents as 10000 then, or should it be be lower for some reason? 回答1: Maxevents is just the length of the struct epoll_events array pointed to by *events . If the kernel has more than that number of events to feed to your program at that time it will see that it should

select模型的原理、优点、缺点

谁说我不能喝 提交于 2019-12-05 17:58:19
I/O多路复用(又被称为“事件驱动”),首先要理解的是,操作系统为你提供了一个功能,当你的某个socket可读或者可写的时候,它可以给你一 个通知。这样当配合非阻塞的socket使用时,只有当系统通知我哪个描述符可读了,我才去执行read操作,可以保证每次read都能读到有效数据而不 做纯返回-1和EAGAIN的无用功。写操作类似。操作系统的这个功能通过select/poll/epoll之类的系统调用来实现,这些函数都可以同时 监视多个描述符的读写就绪状况,这样,**多个描述符的I/O操作都能在一个线程内并发交替地顺序完成,这就叫I/O多路复用,这里的“复用”指的是复用 同一个线程。 I/O复用之select 1、介绍: select系统调用的目的是:在一段指定时间内,监听用户感兴趣的文件描述符上的可读、可写和异常事件。poll和select应该被归类为这样的系统 调用,它们可以阻塞地同时探测一组支持非阻塞的IO设备,直至某一个设备触发了事件或者超过了指定的等待时间——也就是说它们的职责不是做IO,而是帮助 调用者寻找当前就绪的设备。 下面是select的原理图: 2 、select系统调用API如下: #include <sys/time.h> #include <sys/types.h> #include <unistd.h> int select(int nfds, fd

epoll 基本知识与使用

孤者浪人 提交于 2019-12-05 16:30:39
https://blog.csdn.net/qq_35721743/article/details/86742508 epoll 最大的好处在于它不会随着监听 fd 数目的增长而降低效率。 epoll 的接口,一共有三个函数, 都在头文件 #include <sys/epoll.h> 里。 1. 创建 epoll 句柄 int epfd = epoll_create(intsize); 创建一个 epoll 句柄,size 用来告诉内核这个监听的数目一共有多大。当创建好epoll句柄后,它就是会占用一个fd值,在linux下如果查看 /proc/进程id/fd/, 是能够看到这个fd的,所以在使用完epoll后,必须调用 close() 关闭。 否则可能导致 fd 被耗尽。 函数声明: int epoll_create(int size) 该函数生成一个epoll专用的文件描述符。它其实是在内核申请一空间,用来存放你想关注的socket fd 上是否发生以及发生了什么事件。size就是你在这个epoll fd上能关注的最大socket fd 数, 由用户确定, 只要内存空间够用。 2. 将被监听的描述符添加到epoll句柄或从epoll句柄中删除或者对监听事件进行修改 函数声明:int epoll_ctl( int epfd, int op, int fd, struct

Nginx配置参数中文详细说明

只愿长相守 提交于 2019-12-05 15:10:03
#定义Nginx运行的用户和用户组 user www www; # #nginx进程数,建议设置为等于CPU总核心数. worker_processes 8; # #全局错误日志定义类型,[ debug | info | notice | warn | error | crit ] error_log /var/log/nginx/error.log info; # #进程文件 pid /var/run/nginx.pid; # #一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致. worker_rlimit_nofile 65535; # #工作模式与连接数上限 events { #参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型. use epoll; #单个进程最大连接数(最大连接数=连接数*进程数) worker_connections 65535; } # #设定http服务器 http { include mime

IO复用,AIO,BIO,NIO,同步,异步,阻塞和非阻塞 区别

血红的双手。 提交于 2019-12-05 14:56:53
如果面试问到IO操作,这篇文章提到的问题,基本是必问,百度的面试官问我三个问题 (1)什么是NIO(Non-blocked IO),AIO,BIO (2) java IO 与 NIO(New IO)的区别 (3)select 与 epoll,poll区别 我胡乱说了一气,自己边说边觉得完蛋了。果然,二面没过,很简单的问题,回来后赶紧作了总结: 一、什么是socket?什么是I/O操作? 我们都知道 unix(like)世界里,一切皆文件,而文件是什么呢?文件就是一串二进制流而已,不管socket,还是FIFO、管道、终端,对我们来说,一切都是文件,一切都是流。在信息 交换的过程中,我们都是对这些流进行数据的收发操作,简称为I/O操作(input and output) ,往流中读出数据,系统调用read,写入数据,系统调用write。不过话说回来了 ,计算机里有这么多的流,我怎么知道要操作哪个流呢?对,就是 文件描述符 ,即通常所说的fd,一个fd就是一个整数,所以,对这个整数的操作,就是对这个文件(流)的操作。我们创建一个socket,通过系统调用会返回一个文件描述符,那么剩下对socket的操作就会转化为对这个描述符的操作。不能不说这又是一种 分层和抽象的思想 。 二、同步异步,阻塞非阻塞区别联系 实际上同步与异步是针对应用程序与内核的交互而言的

Redis为什么是单线程、及高并发快的3大原因详解

China☆狼群 提交于 2019-12-05 14:47:25
Redis的高并发和快速原因 1.redis是基于内存的,内存的读写速度非常快; 2.redis是单线程的,省去了很多上下文切换线程的时间; 3.redis使用多路复用技术,可以处理并发的连接。非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间。 为什么Redis是单线程的 1.官方答案 因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。 2.性能指标 关于redis的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。 3.详细原因 1)不需要各种锁的性能消耗 Redis的数据结构并不全是简单的Key-Value,还有list,hash等复杂的结构,这些结构有可能会进行很细粒度的操作,比如在很长的列表后面添加一个元素,在hash当中添加或者删除 一个对象。这些操作可能就需要加非常多的锁,导致的结果是同步开销大大增加。 总之,在单线程的情况下,就不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗。 2)单线程多进程集群方案 单线程的威力实际上非常强大,每核心效率也非常高