epoll

Nginx优化配置

蓝咒 提交于 2020-07-27 22:40:57
#user nobody; #定义Nginx运行的用户和用户组 worker_processes auto; #nginx进程数,建议设置为等于CPU总核心数;auto表示自动 error_log logs/host-error.log; error_log logs/error.log notice; error_log logs/error.log info; pid logs/nginx.pid; worker_rlimit_nofile 65535;# Nginx 进程最大可用文件描述符数量,与系统文件描述符一样ulimit -n events { use epoll; #事件模型,linux建议使用epoll模型。 worker_connections 2048; #单个进程允许的客户端最大连接数(最大连接数=连接数*进程数) } http { include mime.types; #文件扩展名与文件类型映射表 autoindex on; # 开启目录浏览功能,合适下载服务器,默认关闭 autoindex_exact_size off; #off显示文件的大概大小,单位是kB或者MB或者GB autoindex_localtime on; #on显示的文件时间为文件的服务器时间 server_tokens off; #off 隐藏nginx版本号 include

Nginx的10万并发内核参数优化

倾然丶 夕夏残阳落幕 提交于 2020-07-27 15:12:22
关于内核参数的优化: net.ipv4.tcp_max_tw_buckets = 6000 timewait的数量,默认是180000。 net.ipv4.ip_local_port_range = 1024 65000 允许系统打开的端口范围。 net.ipv4.tcp_tw_recycle = 1 启用timewait快速回收。 net.ipv4.tcp_tw_reuse = 1 开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接。 net.ipv4.tcp_syncookies = 1 开启SYN Cookies,当出现SYN 等待队列溢出时,启用cookies来处理。 net.core.somaxconn = 262144 web 应用中 listen 函数的 backlog 默认会给我们内核参数的 net.core.somaxconn 限制到 128,而nginx定义的NGX_LISTEN_BACKLOG 默认为511,所以有必要调整这个值。 net.core.netdev_max_backlog = 262144 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包 的最大数目。 net.ipv4.tcp_max_orphans = 262144 系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数

【翻译】.NET 5中的性能改进

白昼怎懂夜的黑 提交于 2020-07-27 08:57:43
【翻译】.NET 5中的性能改进 在.NET Core之前的版本中,其实已经在博客中介绍了在该版本中发现的重大性能改进。 从.NET Core 2.0到.NET Core 2.1到.NET Core 3.0的每一篇文章,发现 谈论越来越多的东西。 然而有趣的是,每次都想知道下一次是否有足够的意义的改进以保证再发表一篇文章。 .NET 5已经实现了许多性能改进,尽管直到今年秋天才计划发布最终版本,并且到那时很有可能会有更多的改进,但是还要强调一下,现在已提供的改进。 在这篇文章中,重点介绍约250个PR,这些请求为整个.NET 5的性能提升做出了巨大贡献。 安装 Benchmark.NET现在是衡量.NET代码性能的规范工具,可轻松分析代码段的吞吐量和分配。 因此,本文中大部分示例都是使用使用该工具编写的微基准来衡量的。首先创建了一个目录,然后使用dotnet工具对其进行了扩展: mkdir Benchmarks cd Benchmarks dotnet new console 生成的Benchmarks.csproj的内容扩展为如下所示: <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <AllowUnsafeBlocks>true</AllowUnsafeBlocks>

多路复用的实现方式:select、poll、epoll

六月ゝ 毕业季﹏ 提交于 2020-07-27 06:01:55
多路复用的实现方式:select、poll、epoll select的基本原理: 监视文件3类描述符: writefds、readfds、和exceptfds; 调用后select函数会阻塞住,等有数据 可读、可写、出异常 或者 超时 就会返回 select函数正常返回后,通过遍历fdset整个数组才能发现哪些句柄发生了事件,来找到就绪的描述符fd,然后进行对应的IO操作 几乎在所有的平台上支持,跨平台支持性好 缺点: select采用轮询的方式扫描文件描述符,全部扫描,随着文件描述符FD数量增多而性能下降 每次调用 select(),需要把 fd 集合从用户态拷贝到内核态,并进行遍历(消息传递都是从内核到用户空间) 最大的缺陷就是单个进程打开的FD有限制,默认是1024 (可修改宏定义,但是效率仍然慢) static final int MAX_FD = 1024 poll的基本流程: select() 和 poll() 系统调用的大体一样,处理多个描述符也是使用轮询的方式,根据描述符的状态进行处理 一样需要把 fd 集合从用户态拷贝到内核态,并进行遍历。 最大区别是: poll没有最大文件描述符限制(使用链表的方式存储fd) epoll基本原理:在2.6内核中提出的,对比select和poll,epoll更加灵活,没有描述符限制,用户态拷贝到内核态只需要一次使用事件通知

java架构师成长路线-高并发网络编程的分类

安稳与你 提交于 2020-07-27 03:58:01
鲁班学院java架构师成长路线 随着互联网时代的到来,高并发网络编程这一新鲜名词早已跃然于纸上,为了满足大众眼光的需求,我为大家找了些关于高并发网络编程方面的资料,本文便来介绍高并发网络编程中的epoll的实现机制,真正理解为何epoll能实现高并发网络编程。 epoll IO多路复用模型实现机制:由于epoll的实现机制与select/poll机制完全不同,上面所说的 select的缺点在epoll上不复存在。 从上面的讲解可知:通过红黑树和双链表数据结构,并结合回调机制,造就了epoll的高效,讲解完了Epoll的机理,我们便能很容易掌握epoll的用法了,三个字描述就是:“三步曲”。 第一步:epoll_wait()系统调用,通过此调用收集收集在epoll监控中已经发生的事件。 第二步:epoll_ctl()系统调用,通过此调用向epoll对象中添加、删除、修改感兴趣的事件,返回0标识成功,返回-1表示失败。 第三步:epoll_create()系统调用,此调用返回一个句柄,之后所有的使用都依靠这个句柄来标识。 如此一来,要实现上面说是的场景,只需要在进程启动时建立一个epoll对象,然后在需要的时候向这个epoll对象中添加或者删除连接。同时,epoll_wait的效率也非常高,因为调用epoll_wait时,并没有一股脑的向操作系统复制这100万个连接的句柄数据

2020年腾讯C++面试题和答案持续更新中-内附视频讲解(10)

只谈情不闲聊 提交于 2020-07-24 19:07:31
大家好我是好好学习天天编程的天天 一个整天在互联网上种菜和砍柴的程序员~ 凭着自己多年的互联网从业经验和对校园招聘的研究,再结合自己当年校招找工作的经验, 今天写了一篇长文: 《计算机专业学生,大三了找技术岗,怎么写一份好简历?内附269份简历模板》 文章仔细介绍了,一份IT大学生如何做一份优秀的简历,以及注意事项。 后期再不断给大家分享:如何投递简历,如何准备面试等相关的话题吧。 接下来还是分享一份腾讯的面试题吧。 2020年腾讯C++面试题一面 来源:牛客 说一下c++语言特点 重载和重写(前者是参数可改,后者参数一样) vector array区别 tcp 三次握手,四次挥手 计网七层协议 tcp udp优缺点 网址访问过程,dns查询迭代,递归查询 http和https的区别,加密的工作原理 进程,线程区别 进程通信,说了个消费者生产者模式 shell脚本写过吗,然后问了具体命令,文件内修改字符命令,进程后台执行命令,还问了几个其他的命令 数据库用过吗,我说用过关系数据库,mysql有啥引擎,事务的四大特点,然后给了数据库表,两道sql题目 描述二叉树的遍历方式,写了个非递归的前序遍历 链表有环的问题 字典树,不知道,然后说子串匹配,我说kmp算法,也没问具体的细节 华为去年的软挑比赛讲了讲 项目中的难点 排序算法,时间复杂度,空间复杂度 然后继续问项目,问的我头皮发麻

How should I use epoll to read and write from the same FD

雨燕双飞 提交于 2020-05-29 10:46:39
问题 Environment Linux x64 Ubuntu 16.4 C++ Use-case Async IO ( epoll ) A socket is used for both reading and writing Read & Write operations and not in sync and are iteratively done on the socket Sample flow Setup socket ( EPOLL_CTL_ADD ) Start read ( EPOLL_CTL_MOD + EPOLLIN | EPOLLONESHOT ) While waiting for data to be read [a] Write some data ( EPOLL_CTL_MOD + EPOLLOUT | EPOLLONESHOT ) Problem description At #2 above a EPOLLIN read operation is registered At #3.a, a EPOLLOUT write completion is

How should I use epoll to read and write from the same FD

梦想的初衷 提交于 2020-05-29 10:46:27
问题 Environment Linux x64 Ubuntu 16.4 C++ Use-case Async IO ( epoll ) A socket is used for both reading and writing Read & Write operations and not in sync and are iteratively done on the socket Sample flow Setup socket ( EPOLL_CTL_ADD ) Start read ( EPOLL_CTL_MOD + EPOLLIN | EPOLLONESHOT ) While waiting for data to be read [a] Write some data ( EPOLL_CTL_MOD + EPOLLOUT | EPOLLONESHOT ) Problem description At #2 above a EPOLLIN read operation is registered At #3.a, a EPOLLOUT write completion is

一张脑图说清 Nginx 的主流程

a 夏天 提交于 2020-05-09 06:33:01
一张脑图说清 Nginx 的主流程 这个脑图在 nginx-1.14.0-research 上。这是我在研究nginx的http模块的时候画的。基本上把 Nginx 主流程(特别是 HTTP 的部分)的关键函数和关键设置画了下来,了解了这个脑图,就对整个 Nginx 的主流程有了定性的了解了。 Nginx 的启动过程分为两个部分,一个部分是读取配置文件,做配置文件中配置的一些事情(比如监听端口等)。第二个部分是形成 Master-Worker 的多进程模型。这两个过程就是 Nginx 代码中最重要的两个函数: ngx_init_cycle 和 ngx_master_process_cycle ngx_init_cycle ngx_init_cycle 是 Nginx 中最重要的函数,没有之一。我们可以想想,如果我们写一个和 Nginx 一样的 Web 服务,我们会怎么做?我们大致的思路一定是解析配置文件,把配置文件存入到一个数据结构中,然后根据数据结构,进行端口监听。是的,差不多,Nginx 就是这么一个流程。不过 Nginx 里面有个模块的概念,所有的功能都是用模块的方式进行加载的。 Nginx 的模块 Nginx 的模块分为几类,这几类分别为 Core,Event,Conf,Http,Mail。看名字就知道 Core 模块是最重要的。模块是什么意思呢?它包含一堆命令(cmd

redis详解(包含使用场景)

北战南征 提交于 2020-05-08 23:49:45
本文围绕以下几点进行阐述 1、为什么使用redis 2、使用redis有什么缺点 3、单线程的redis为什么这么快 4、redis的数据类型,以及每种数据类型的使用场景 5、redis的过期策略以及内存淘汰机制 6、redis和数据库双写一致性问题 7、如何应对缓存穿透和缓存雪崩问题 8、如何解决redis的并发竞争问题 1、为什么使用redis 分析:博主觉得在项目中使用redis,主要是从两个角度去考虑:性能和并发。当然,redis还具备可以做分布式锁等其他功能,但是如果只是为了分布式锁这些其他功能,完全还有其他中间件(如zookpeer等)代替,并不是非要使用redis。因此,这个问题主要从性能和并发两个角度去答。 回答:如下所示,分为两点 (一)性能 如下图所示,我们在碰到需要执行耗时特别久,且结果不频繁变动的SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。 (二)并发 如下图所示,在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问数据库。 2、使用redis有什么缺点 分析:大家用redis这么久,这个问题是必须要了解的,基本上使用redis都会碰到一些问题,常见的也就几个。 回答:主要是四个问题 (一