方法论

软件层面

增大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为例)的更多相关文章

  1. 【高性能服务器】Nginx剖析

    引言 Nginx是一个流行的高性能服务器,官方宣称在压力测试下可以支持5万个并发连接,而且占用内存极低.相比于其他昂贵的硬件负载均衡解决方案,Nginx是开源免费的,可以大大降低成本.本文将从一下几个 ...

  2. 构建高效安全的Nginx Web服务器

    一 为什么选择Nginx搭建Web服务器 Apache和Nginx是目前使用最火的两种Web服务器,Apache出现比Nginx早.Apache HTTP Server(简称Apache)是世界使用排 ...

  3. 170522、Linux 平台通过 nginx 和 vsftpd 构建图片服务器

    Nginx WEB 服务器 Nginx 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Igor Sysoev 为俄罗斯访问量第 ...

  4. Nginx作为高性能服务器的缘由以及请求过程

    Nginx作为高性能服务器的缘由以及请求过程 简介: Nginxx采用的是多进程(单线程)&多路IO复用模型,使用I/O多路复用技术的Nginx,就成了"并发事件驱动"的服 ...

  5. 【读书笔记】2016.12.10 《构建高性能Web站点》

    本文地址 分享提纲: 1. 概述 2. 知识点 3. 待整理点 4. 参考文档 1. 概述 1.1)[该书信息] <构建高性能Web站点>: -- 百度百科 -- 本书目录: 第1章 绪论 ...

  6. 《构建高性能web站点》随笔 无处不在的性能问题

    前言– 追寻大牛的足迹,无处不在的“性能”问题. 最近在读郭欣大牛的<构建高性能Web站点>,读完收益颇多.作者从HTTP.多级缓存.服务器并发策略.数据库.负载均衡.分布式文件系统多个方 ...

  7. 开源软件实践之linux高性能服务器编程框架和选型

    很多人学习编程技术一般都通过一本编程语言的入门书籍,然后尝试做一些例子和小项目.但是这些都不能让我们深入的学习很多的编程技巧和高深技术,当然这个时候很多有经验的学习人员就会告诉大家,找一个好的开源软件 ...

  8. 《构建高性能 Web站点》笔记

    书名:构建高性能Web站点 出版社: 电子工业出版社 ISBN:9787121170935 一  绪论 等待的时间: (1) 数据在网络上的传输时间 (2) 站点服务器处理请求并生成回应数据的时间 ( ...

  9. 构建高性能高并发Java系统 .

    转:http://blog.csdn.net/nengyu/article/details/7591854 场景这里指的高性能高并发服务器是一个有状态的服务,可以理解成web或者socket服务器,每 ...

随机推荐

  1. 启动VNC Shell扩展

    下载source files - 18.3 Kb Introduction 我们使用RealVNC来远程控制我们的网络中的pc机,VNC是一个伟大的产品,但如果不记住计算机名称,它可以是乏味的,在网络 ...

  2. CN1,CN2 GT和CN2 GIA的区别

    用一句话来概括,CN1主要定位于承载普通质量的互联网业务,而CN2则定位于承载企业VPN业务.中国电信的自营业务及高质量的互联网业务,CN2 GIA又比GT要好一些. 顺序:CN2 GIA>CN ...

  3. 算法进阶 (LIS变形) 固定长度截取求最长不下降子序列【动态规划】【树状数组】

    先学习下LIS最长上升子序列 ​ 看了大佬的文章OTZ:最长上升子序列 (LIS) 详解+例题模板 (全),其中包含普通O(n)算法*和以LIS长度及末尾元素成立数组的普通O(nlogn)算法,当然还 ...

  4. 记录小坑-tp5 使用模型select查询

    场景: 使用模型去select查询后进行业务处理 再进行 saveAll 提示缺少更新条件 坑点:此时取出的数据结构是 query对象 { array:[ xxxx => xxx ] }: sa ...

  5. JavaScript常用对象介绍

    目录 对象(object) 对象的创建方式 点语法 括号表示法 内置对象 Array 数组创建方式 检测数组 转换方法 分割字符串 栈方法 队列方法 重排序方法 操作方法 位置方法 迭代方法 Stri ...

  6. Git命令diff格式详解

    diff是Unix系统的一个很重要的工具程序. 它用来比较两个文本文件的差异,是代码版本管理的基石之一.你在命令行下,输入: $ diff <变动前的文件> <变动后的文件> ...

  7. Linux系统常用API总结

    1.错误处理 - fprintf() - perror() 2.通用I/O模型 - fd = open(pathname, flags, mode) - numread = read(fd, buff ...

  8. ScanTailor-ScanTailor 强大的多方位的满足处理扫描图片的需求

    ScanTailor 强大的多方位的满足处理扫描图片的需求   ScanTailor 能做什么? 批量或单张或选择区间旋转图片 自动切割页面,同时提供手动选项 自动识别图像歪斜角度,同时提供手动选项 ...

  9. spring boot:spring security+oauth2+sso+jwt实现单点登录(spring boot 2.3.3)

    一,sso的用途 ? 1,如果有多个应用系统,用户只需要登录一次就可以访问所有相互信任的应用系统. 不需要每次输入用户名称和用户密码, 也不需要创建并记忆多套用户名称和用户密码. 2,系统管理员只需维 ...

  10. php 反射 实例化类

    <?php class Person { public $name; public $sex; public function __construct($name,$sex=1) { $this ...