<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Ops on erpan&#39;s note</title>
    <link>https://940504.top/categories/ops/</link>
    <description>Recent content in Ops on erpan&#39;s note</description>
    <image>
      <title>erpan&#39;s note</title>
      <url>https://940504.top/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</url>
      <link>https://940504.top/%3Clink%20or%20path%20of%20image%20for%20opengraph,%20twitter-cards%3E</link>
    </image>
    <generator>Hugo -- 0.154.5</generator>
    <language>en</language>
    <copyright>浙ICP备2021018236号-1</copyright>
    <lastBuildDate>Sun, 02 Aug 2020 21:57:04 +0800</lastBuildDate>
    <atom:link href="https://940504.top/categories/ops/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Nginx优化</title>
      <link>https://940504.top/posts/nginx%E4%BC%98%E5%8C%96/</link>
      <pubDate>Sun, 02 Aug 2020 21:57:04 +0800</pubDate>
      <guid>https://940504.top/posts/nginx%E4%BC%98%E5%8C%96/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;参考：&lt;a href=&#34;https://www.nginx.com/blog/tuning-nginx/&#34;&gt;https://www.nginx.com/blog/tuning-nginx/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;nginx一般用作高性能反向代理。在http七层代理的情况下，它首先接收客户端请求，经过处理后再请求upstream server，因此nginx服务器上的连接数是客户端请求数的2倍，在高并发情况下，建立的连接数非常多，因此系统相关资源如打开文件数、tcp连接、可分配端口等很可能称为其瓶颈。可以从系统内核参数及nginx自身做一些优化。下面提到的相关参数&lt;strong&gt;按需调整&lt;/strong&gt;。&lt;/p&gt;
&lt;h2 id=&#34;相关内核参数&#34;&gt;相关内核参数&lt;/h2&gt;
&lt;h3 id=&#34;tcp连接队列调整&#34;&gt;tcp连接队列调整&lt;/h3&gt;
&lt;p&gt;在内核中，为tcp连接维护了两个队列。一个是已经建立了连接的accept队列，这时候连接三次握手已经完毕，处于 established 状态；一个是还没有完全建立连接的队列，这个时候三次握手还没完成，处于 syn_rcvd 的状态。过程如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;当server接收到client的 SYN 报⽂时，会将其加⼊到内核的SYN半连接队列&lt;/li&gt;
&lt;li&gt;接着发送SYN+ACK给client，等待client回应ACK报⽂，client收到此包后connect()调用返回，进入establish状态&lt;/li&gt;
&lt;li&gt;server接收到ACK报⽂后，把此连接从SYN队列移除并放⼊到Accept队列&lt;/li&gt;
&lt;li&gt;此时server端应⽤调⽤accpet() socket接⼝从Accept 队列取出连接用于数据通信&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如何查看这两个队列情况？&lt;/p&gt;
&lt;p&gt;全连接查看：&lt;code&gt;ss -ant&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;半连接查看：&lt;code&gt;ss -ant | grep -i syn_recv | wc -l&lt;/code&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;LISTEN：
&lt;ul&gt;
&lt;li&gt;Recv-Q 表示当前socket完成三次握手等待用户进程（此处即nginx）accept的连接个数，即全连接队列使用量。一般我们常常看到此值为0，没有堆积&lt;/li&gt;
&lt;li&gt;Send-Q 表示当前socket全连接队列最大长度&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;非LISTEN：
&lt;ul&gt;
&lt;li&gt;Recv-Q 表示receive queue中已收到未读取的字节大小&lt;/li&gt;
&lt;li&gt;Send-Q 表示send queue中已发送未收到确认的字节大小&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;队列满了的情况&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;半连接满&lt;/p&gt;
&lt;p&gt;此时会发生syn包被丢弃的现象，因而客户端会重试，性能下降。可能是syn攻击导致&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ netstat -s &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep -i syn
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;m&#34;&gt;612&lt;/span&gt; SYNs to LISTEN sockets dropped
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;
&lt;p&gt;全连接满&lt;/p&gt;
&lt;p&gt;并发量大，server端accept()调用过慢时出现，可能由于服务器负载、应用程序本身等问题导致。
满了后新的连接直接丢弃或者回复reset包，此行为由内核参数&lt;a href=&#34;https://www.kernel.org/doc/html/latest/networking/ip-sysctl.html#tcp-variables&#34;&gt;tcp_abort_on_overflow&lt;/a&gt;控制（为0直接丢弃，为1回reset包），且内核socket统计信息里面listen overflowed数加1。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ netstat -s &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep -i overflow
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;m&#34;&gt;612&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;times&lt;/span&gt; the listen queue of a socket overflowed
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;调优上可以适当增大全连接和半连接队列&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
