如何构建高性能服务器(以Nginx为例)
方法论
软件层面
增大CPU利用率
使用全部CPU, worker进程数等于CPU
进程间不做无用的切换
繁忙时不主动让出CPU
worker进程之间不争抢CPU
CPU切换需要5us,如果大量进程需要切换,则CPU会浪费大量的时间切换,做无用功
worker进程绑定CPU
pidstat -w可以查看某个进程的切换次数
不被其他进程抢占资源
提高进程优先级,获得更大的CPU时间片
减少其他进程
减少惊群
场景:多个worker进程accept同一个端口时
默认accept_mutex on
多个worker进程争抢锁获得连接,同时只有一个worker获得连接
accept_mutex off
一个连接请求唤醒所有worker进程,同时只有一个worker获得连接,存在惊群问题,当worker进程数不多时,影响不大,少了争锁,高并发时可以提高系统响应能力
SO_REUSEPORT
内核3.9+处理大并发连接新特性,开启后,连接通过内核分配worker进程,性能最好
提高CPU缓存命中率
绑定worker到指定CPU: worker_cpu_affinity cpumask...
增大内存利用率
使用tcmalloc
减少内存碎片
并发能力高于glibc,并发数越多,性能越能体现(小内存分配)
google-perftools/.../tcmalloc.html
需要手动编译到nginx
增大IO利用率
对比
机械硬盘
- 价格低
- 存储量大
- BPS大,适合顺序读写
- IOPS小,不适合随机读写
- 寿命长
固态应胖
- 价格高
- 存储量小
- BPS大
- IOPS大
- 写寿命短
优化读取
sendfile零拷贝
文件直接从内核态的文件到socket的传递
location /video/{
sendfile on;
aio on;
directio 8m;
}
gzip_static
提前压缩文件,加快gzip报文的返回
内存盘/SSD盘
减少写入
empty_gif
使用返回一张1*1的空白图片,以减少http的返回报文长度
AIO
在磁盘读写时,进程可以处理其他事情
aio on|off|threads=[pool]
直接IO,减少一次缓存的读写
directio size|off 超过size则使用直接io,适合大文件
增大error_log级别
error.log输出到内存
error_log memory: 32m debug
日志在32m的内存进行循环输出,只能看到32m的调试日志,可以提高性能
关闭access_log
压缩access_log
access_log path [format] [gzip]
是否开启proxy buffering
syslog替代本地io
使用UDP写入代替io写入,提高性能
线程池thread pool
当某些io会阻塞时,使用线程池
增大网络宽带利用率
syn重试次数
net.ipv4.tcp_syn_retries = 6
本地端口可用范围
net.ipv4.ip_local_port_range=32768 60999
可以放大
连接超时
proxy_connect_timeout
接收连接最大个数(syn未完成握手)
net.ipv4.tcp_max_syn_backlog = 262144
可以适当放大
已完成握手
net.core.somaxconn:系统最大backlog队列长度
超出队列可以接收报文直接回RST
net.ipv4.tcp_abort_on_overflow
未被内核处理的报文队列长度
net.core.netdev_max_backlog
syn/ack重试次数
net.ipv4.tcp_synack_retries
处理syn攻击
net.ipv4.tcp_syncookies=1
当syn队列满后,新的syn不进入队列,计算出cookie返回客户端,客户端携带cookie重新连接,服务器验证cookie,通过则建立连接。回导致TCP可选功能失效,例如扩充窗口/时间戳等
操作系统最大句柄
fs.file-max: 操作系统可以使用最大句柄数
使用fs.file-nr可以查看当前已分配/正使用/上限
用户最大句柄数
/etc/security/limits.conf
root soft nofile 63535
root har nofile 65535
进程限制最大句柄数
worker_rlimit_nofile number
进程最大连接数
worker_connections number
Tcp Fast Open
当TCP再次连接时,通过携带cookie,减少一次syn/ack的rtt时间,达到快速建立TCP连接的目的
net.ipv4.tcp_fastopen 0|1|2|3
listen address [:port] [fastopen=number];
fastopen=number为了防止带数据的syn攻击,限制最大长度,指定TFO连接队列的最大长度
TCP缓冲区
net.ipv4.tcp_rmen = 4096 87380 6291456
net.ipv4.tcp_wmen = 4096 87380 6291456
net.ipv4.tcp_men = 1541646 2055528 3083292
net.ipv4.tcp_moderate_rcvbuf=1开启自动调节缓存模式
listen address [:port] [recvbuf=size] [sndbuf=size]
net.ipv4.tcp_adv_win_scale = 1
应用缓存 = buffer / (2^tcp_adv_win_scale)
接收窗口 = buffer - buffer/(2^tcp_adv_win_scale)
BDP = 带宽* RTT/2
buffer=BDP
Nagle算法
网络中只存在一个未被确认的小报文ACK
目的:避免一个连接上存在大量的小报文,提高网络利用率
吞吐量优先:启用Nagle tcp_nodelay off
低延时优先:禁用Nagle tcp_nodelay on
拥塞窗口
实际流量=拥塞窗口和接收窗口的最小值
慢启动
指数扩展拥塞窗口cwnd = cwnd*2
拥塞避免
窗口大于threshold线性增大
拥塞发生
发生丢包,
RTO超时,threshold = cwnd/2, cwnd=1
Fast Retransmit: cwnd=cwnd/2, threshold=cwnd
快速恢复
当Fast Retransmit出现时,cwnd调整为threshold+3*MSS
优化慢启动
增大初始cwnd=10
TCP keep-alive
开启keepalive可以探测到失去连接的socket,并即时关闭,节省系统资源
net.ipv4.tcp_keepalive_time = 7200
net.ipv4.tcp_keepalive_intvl = 75
net.ipv4.tcp_keepalive_probes = 9
timewait
net.ipv4.tcp_orphan_retries = 0
net.ipv4.tcp_fin_timeout = 60
net.ipv4.tcp_max_tw_buckets = 262144 最大timewait连接数,超出直接关闭连接
lingering_close延迟关闭
当接收缓冲依然接收到客户端的内容,服务器如果马上发送RST关闭连接,会导致客户端由于接收到RST而忽略http response
lingering_close off|on|always
reset_timedout_connection on|off; 当读写超时生效依法连接关闭,通过发送RST马上关闭连接,以释放资源
TLS/SLL优化握手
ssl_session_cache
TLS/SSL会话票证tickets
Nginx将会话session中的信息作为tickets加密发送给客户端,当客户端再次建立连接时带上tickets,Nignx验证复用session
优点可以减少对称加解密的次数,提高性能
缺点降低安全性,需要经常更换tickets密钥
ssl_seesion_tickets on|off
ssl_session_ticket_key file
使用HTTP长连接
keepalive_request number;
gzip压缩
提高网络传输效率
gzip on|off
使用http2
统计函数调用统计
google-perltool
pprof --text|pdf
goodle_perftools_profiles file
硬件
- 网卡:万兆网卡,例如10G/25G/40G
- 磁盘:固态硬盘,关注IOPS/BPS指标
- CPU:更快的主频,更大的缓存,更优的架构
- 内存:更快的访问速度
DNS
如何构建高性能服务器(以Nginx为例)的更多相关文章
- 【高性能服务器】Nginx剖析
引言 Nginx是一个流行的高性能服务器,官方宣称在压力测试下可以支持5万个并发连接,而且占用内存极低.相比于其他昂贵的硬件负载均衡解决方案,Nginx是开源免费的,可以大大降低成本.本文将从一下几个 ...
- 构建高效安全的Nginx Web服务器
一 为什么选择Nginx搭建Web服务器 Apache和Nginx是目前使用最火的两种Web服务器,Apache出现比Nginx早.Apache HTTP Server(简称Apache)是世界使用排 ...
- 170522、Linux 平台通过 nginx 和 vsftpd 构建图片服务器
Nginx WEB 服务器 Nginx 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sysoev 为俄罗斯访问量第 ...
- Nginx作为高性能服务器的缘由以及请求过程
Nginx作为高性能服务器的缘由以及请求过程 简介: Nginxx采用的是多进程(单线程)&多路IO复用模型,使用I/O多路复用技术的Nginx,就成了"并发事件驱动"的服 ...
- 【读书笔记】2016.12.10 《构建高性能Web站点》
本文地址 分享提纲: 1. 概述 2. 知识点 3. 待整理点 4. 参考文档 1. 概述 1.1)[该书信息] <构建高性能Web站点>: -- 百度百科 -- 本书目录: 第1章 绪论 ...
- 《构建高性能web站点》随笔 无处不在的性能问题
前言– 追寻大牛的足迹,无处不在的“性能”问题. 最近在读郭欣大牛的<构建高性能Web站点>,读完收益颇多.作者从HTTP.多级缓存.服务器并发策略.数据库.负载均衡.分布式文件系统多个方 ...
- 开源软件实践之linux高性能服务器编程框架和选型
很多人学习编程技术一般都通过一本编程语言的入门书籍,然后尝试做一些例子和小项目.但是这些都不能让我们深入的学习很多的编程技巧和高深技术,当然这个时候很多有经验的学习人员就会告诉大家,找一个好的开源软件 ...
- 《构建高性能 Web站点》笔记
书名:构建高性能Web站点 出版社: 电子工业出版社 ISBN:9787121170935 一 绪论 等待的时间: (1) 数据在网络上的传输时间 (2) 站点服务器处理请求并生成回应数据的时间 ( ...
- 构建高性能高并发Java系统 .
转:http://blog.csdn.net/nengyu/article/details/7591854 场景这里指的高性能高并发服务器是一个有状态的服务,可以理解成web或者socket服务器,每 ...
随机推荐
- 使用css实现轮播图
使用css3实现图片轮播 前言:实现图片轮播的方式有很多种 ,例如js ,css 等等. 本文主要讲述使用纯css3实现轮播图 工具介绍: 使用的编辑器: Hbuilder 进入正题 html代码: ...
- 两大IT培训巨头,达内和传智播客哪个更好?
多年来,从财报收入及培训规模角度来看,达内和传智播客分别在IT培训领域占据第一和第二的位置已经是不争的事实,但是从培训学员的角度来讲,选择达内和传智播客哪个更好呢,这两家机构在学员心目中的排名和营收的 ...
- 关于.netMVC 出现@ViewBag 出现错误(波浪红线)的解决方法
解决vs2015.vs2013解决mvc5 viewbag问题 1.关闭vs2015或者vs2013 打开我的电脑或者文件夹 2.打开我的电脑 在地址栏输入 %UserProfile%\AppData ...
- .net 手动建DataTable 获取DataTable列名 修改DataTable 列的顺序
//创建 表 DataTable tables = new DataTable(); //添加 创建 列 //第一列 DataColumn cums = new DataColumn(); cums. ...
- XUEXI0.4
1.堆是一种内存管理方式,堆和栈是没有关联的.由于内存的容量很大,并且内存需求在时间和空间上没有规律,所以对操作系统来说,管理内存是非常复杂的. 2.堆这种内存管理方式特点是自由.堆内存是由操作系统划 ...
- 如何使用 Gin 和 Gorm 搭建一个简单的 API 服务 (二)
创建 API 我们之前已经跑过 Gin 框架的代码,现在是时候加些功能进去了. 读取全部信息 我们先从"增删改查"中的"查"入手,查询我们之前添加的信息.我接下来要删除几行代码,并把 Gin ...
- go cap和len区别
首先要搞清楚容量和长度的区别: 容量是指底层数组的大小,长度指可以使用的大小 容量的用处在哪?在与当你用 appen d扩展长度时,如果新的长度小于容量,不会更换底层数组,否则,go 会新申请一个底层 ...
- 基于Docker的MySql
MySQL Server安装教程 考虑到实际情况需要经常使用MySQL,为了方便大家能够快速基于Docker搭建MySQL这里以Linux下为例 进行说明,对于Windows用户来说直接通过查看官网H ...
- 详解GaussDB(DWS) explain分布式执行计划
摘要:本文主要介绍如何详细解读GaussDB(DWS)产生的分布式执行计划,从计划中发现性能调优点. 前言 执行计划(又称解释计划)是数据库执行SQL语句的具体步骤,例如通过索引还是全表扫描访问表中的 ...
- CTF相关
https://blog.csdn.net/zxl2016/article/details/96482763