<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>woshishui (ppppppppp)</title>
    <link>https://ruby-china.org/woshishui</link>
    <description/>
    <language>en-us</language>
    <item>
      <title>关于 Rails 自动加载引起的慢请求</title>
      <description>&lt;h3 id="事情背景:"&gt;事情背景：&lt;/h3&gt;&lt;h4 id="rails 每过一定时间就会出现较慢的请求(从平均20ms变到100ms左右),经过排查,把问题定位到rails本身,排除了以下问题:"&gt;rails 每过一定时间就会出现较慢的请求 (从平均 20ms 变到 100ms 左右),经过排查，把问题定位到 rails 本身，排除了以下问题：&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;数据库的问题&lt;/li&gt;
&lt;li&gt;active record 的 connection pool 的问题&lt;/li&gt;
&lt;li&gt;GC 的问题&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="观察:"&gt;观察：&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;rails 服务器重启之后，第一次请求会变慢 (所谓的变慢已经排除了外部的资源加载的因素),表现为一个 method 里面&lt;strong&gt;对 ActiveReocrd 的每一个调用&lt;/strong&gt;都会慢 2-5 倍，(从 2ms 变成      10ms)。于是总的时长就由 20ms -&amp;gt; 100ms. &lt;/li&gt;
&lt;li&gt;各个方法的变化幅度是一致的：即&lt;strong&gt;偶然出现的变慢请求&lt;/strong&gt;和&lt;strong&gt;重启之后的第一次请求&lt;/strong&gt;,3 条不同 sql 变慢幅度一致 (eg: sql A 都是从 10ms 变成 40ms,sql B 都是从 2ms 变成 13ms).&lt;/li&gt;
&lt;li&gt;我由此推测是因为加载导致的，于是在线下的 development 模式下运行，发现将代码增加一个空格之后，会导致程序出现类似的变慢，但是第二次请求恢复正常。
  我推测这是由于 rails 发现监视的文件变化了，所以将所有常量的加载记录移除了，这样运行新的代码时，解释器发现未知常量，于是调用 const_miss 方法去加载，从而变慢。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="问题:"&gt;问题：&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;请问 production 环境中，为什么会出现类似的问题？(即所有操作都变慢一定的幅度)。线上环境并没有&lt;strong&gt;实时&lt;/strong&gt;修改代码，也不会&lt;strong&gt;自动加载&lt;/strong&gt;,但是表现是非常类似的。&lt;/li&gt;
&lt;li&gt;如果存在这样的问题，是否需要解决 (因为变慢的概率和幅度都不大，暂时可以接受),是否可以解决 (通过修改什么参数或者配置？)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="END:"&gt;END:&lt;/h3&gt;
&lt;p&gt;&lt;a href="/huacnlee" class="user-mention" title="@huacnlee"&gt;&lt;i&gt;@&lt;/i&gt;huacnlee&lt;/a&gt;  &lt;a href="/Rei" class="user-mention" title="@Rei"&gt;&lt;i&gt;@&lt;/i&gt;Rei&lt;/a&gt;  &lt;a href="/luikore" class="user-mention" title="@luikore"&gt;&lt;i&gt;@&lt;/i&gt;luikore&lt;/a&gt;  &lt;a href="/jasl" class="user-mention" title="@jasl"&gt;&lt;i&gt;@&lt;/i&gt;jasl&lt;/a&gt; ，感谢各位大佬！&lt;/p&gt;</description>
      <author>woshishui</author>
      <pubDate>Sat, 20 Jan 2018 18:16:53 +0800</pubDate>
      <link>https://ruby-china.org/topics/34928</link>
      <guid>https://ruby-china.org/topics/34928</guid>
    </item>
    <item>
      <title>如何在线上 Rails 环境中对刚刚执行对 SQL 进行 show profile?</title>
      <description>&lt;p&gt;各位大佬好，我是一个 rails 新手，最近遇到了一点问题：&lt;/p&gt;

&lt;p&gt;某一条 sql 在线上环境中有一定概率 (5% 左右) 出现较长的执行时间，而线下环境无法复现。&lt;/p&gt;
&lt;h4 id="现在已经进行对思考和简单实践:"&gt;现在已经进行对思考和简单实践：&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;初步怀疑是&lt;strong&gt;innodb_buffer_size&lt;/strong&gt;太小导致，同时查看了&lt;strong&gt;cache&lt;/strong&gt;,发现命中情况并不理想，也怀疑存在 cache lock 有影响。接下来准备调整参数。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;如果想看看具体是哪里慢了，我想到的办法是把过去的 N(15 &amp;lt;= N &amp;lt;= 100) 条 profile 都记录出来，然后 parse 出最近的几条（需要的 sql）query id，然后执行 show profile for query xxx;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;存在的疑惑:
      profile 的打开与否似乎是 session 级别的（不确定，但是实验现象表面如此）,那么我需要每次都在需要定位的模块开头 set profile = 1，然后才能执行下面的操作吗？
      我的线上环境是 多进程 + 多线程，那么每一个线程拿到的 connecrtion 是不是只记录了对应的 sql 呢？这样无论多高的并发，我都可以拿到最近执行的 sql profile 情况而不用担心&lt;br&gt;
      被其他 sql 冲走。&lt;/p&gt;
&lt;h3 id="请问我这样的想法有没有问题？ 害怕在线上这样搞出问题,请指教。"&gt;请问我这样的想法有没有问题？害怕在线上这样搞出问题，请指教。&lt;/h3&gt;
&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>woshishui</author>
      <pubDate>Fri, 19 Jan 2018 20:34:01 +0800</pubDate>
      <link>https://ruby-china.org/topics/34923</link>
      <guid>https://ruby-china.org/topics/34923</guid>
    </item>
  </channel>
</rss>
