<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>elasticsearch &amp;mdash; tnpl.me</title>
    <link>https://tnpl.me/tag:elasticsearch</link>
    <description></description>
    <pubDate>Sun, 26 Apr 2026 19:30:08 +0000</pubDate>
    <item>
      <title>Tuning Elasticsearch</title>
      <link>https://tnpl.me/tuning-elasticsearch</link>
      <description>&lt;![CDATA[ที่บริษัทใช้ ELK (Elasticsearch, Logstash, Kibana) ทำระบบ centralize log และผมกำลังสนใจว่าอยากจะใช้ Elasticsearch ในการทำ time-series สำหรับ monitor ระบบไปด้วย เลยขอลงมาดูรายละเอียดงานด้วยตัวเองบ้าง&#xA;&#xA;อันดับแรกคือทำอย่างไรให้ระบบ centralize log มีความเร็วเพียงพอต่อการ ingest log เข้าไป และจากนั้นค่อยดูว่าทำอย่างไรให้ query log/aggregate log data ได้รวดเร็ว&#xA;&#xA;ตัวเลข stats ปัจจุบันที่ ELK แสดงมีดังนี้&#xA;&#xA;1,000,000 log lines in each minute (from Kibana)&#xA;100,000 average ingest rate per minute (from AWS)&#xA;9,200,000,000 searchable document (from AWS)&#xA;&#xA;!--more--&#xA;&#xA;Elasticsearch cluster ที่ใช้&#xA;&#xA;AWS Elasticsearch&#xA;3 x c5.large.elasticsearch - master node&#xA;2 x i3.2xlarge - Hot data node&#xA;8 x ultrawarm1.medium.elasticsearch&#xA;&#xA;Tuning for ingest&#xA;&#xA;team setup cluster ไว้ว่าเมื่อจะ ingest document ให้ไปเขียนลงในเครื่อง hot data node ดังนั้นจะมี 2 เครื่อง i3.2xlarge คอย handle ตรงนี้ เราเริ่มเจอปัญหา log delay เพราะ ingest จาก logstash เข้า elasticsearch ไม่ทัน จึงเริ่ม tuning&#xA;&#xA;เริ่มจากทดลองเปิด i3.2xlarge เพิ่มอีก 1 เครื่องรวมเป็น 3 เครื่อง ก็ดีขึ้น แต่ดูแนวโน้มแล้วถ้าจำนวน log เพิ่มน่าจะไม่ไหวอยู่ดี จึงหาวิธี tune เพิ่มเติม&#xA;&#xA;ไปดูกราฟ cluster status ต่างๆ เจอว่า CPU hot data node แตะ 100% ตลอดเวลา&#xA;&#xA;ลองปรับ type ของแต่ละ field ให้ใช้เป็น keyword แทน text เพื่อที่จะได้ไม่ต้องเสียเวลา analyze ตรงนี้ไม่ช่วยเท่าไร จากนั้นลองเช็ค config index template ดู set ไว้ตามนี้&#xA;&#xA;index.refreshinterval = 60s&#xA;index.numberofreplicas = 0&#xA;index.numberofshards = 6&#xA;&#xA;ทีมลองปรับ logstash batch size จากเดิม 400 เป็น 800 อันนี้เห็นว่าดีขึ้น ตัว logstash queue size ลดลงเร็วกว่าเดิม แต่ยังไม่ชัดมาก ลองดันขึ้นเป็น 1600 ก็ไม่ค่อยต่าง และ CPU ของ data node ยัง 100% เสมอ&#xA;&#xA;ลองลดเครื่อง data node ลงเหลือ 2 เครื่องเหมือนเดิม แล้วลอง tune&#xA;&#xA;ไปเจอว่ามี translog setting ที่น่าจะเกี่ยว เดาว่าจะช่วยลดการ sync ข้อมูลลง disk จะช่วยให้ index เร็วขึ้น ลอง setting ตามนี้&#xA;&#xA;index.translog.durability = async&#xA;index.translog.syncinterval = 1m&#xA;&#xA;ซึ่งคิดว่าเรายอมเสีย log 1 นาทีได้ถ้าเครื่องมัน crash ไป&#xA;&#xA;หลังจาก tune แล้ว performance ดีขึ้นเยอะมาก ไม่มี queue รอ ingest อีกต่อไป และ CPU ของ elasticsearch ก็ไม่เต็ม 100% ตลอดเวลาอีกแล้ว&#xA;&#xA;Tuning for query&#xA;&#xA;ผมมี plan ว่าอยากจะลองใช้ elasticsearch ทำ metric แบบ prometheus เพื่อประโยชน์ในเรื่องต่างๆ&#xA;&#xA;log กับ metric อยู่ใน storage เดียวกัน สามารถ query ร่วมกันได้&#xA;aggregate จาก raw data โดยตรงได้ โดยที่ไม่โดน down sampling แบบ prometheus&#xA;ถ้าเห็นว่า metric ตัวไหนมีปัญหา สามารถ query เจาดู raw data ได้ ซึ่ง prometheus ทำไม่ได้&#xA;เอาไปทำ distributed tracing ได้&#xA;สามารถ log metric อะไรลงไปก็ได้ผ่าน stdout โดยไม่ต้องทำ prometheus exporter&#xA;&#xA;ผมยังทำ metric ไปไม่ถึงจุดนั้น แต่ก็อยากจะดูไว้ก่อนว่าจะเจอปัญหาอะไรบ้าง เพราะจำนวน log lines per minute มันเยอะมากๆ นาทีละ 1,000,000 line ถ้าอยากจะดู time-series ยาวๆ สัก 24 ชั่วโมง ก็คง hit 1,440,000,000 doc ที่ต้อง query + aggregate ซึ่งไม่รู้ว่ามันจะไหวจริงๆ หรือเปล่า&#xA;&#xA;ไปเจอบทความนึงเขียนไว้ค่อนข้างละเอียดเรื่องการ tune elasticsearch เลยอยากเอามา share&#xA;&#xA;https://medium.com/thousandeyes-engineering/what-we-learned-using-elasticsearch-as-a-time-series-database-bdbde38cdb64&#xA;&#xA;Take away&#xA;&#xA;elasticsearch สามารถ tune ได้เยอะมากๆ ในจุดต่างๆ แต่ที่สำคัญที่สุดคือเราต้องนึกให้ออกว่าแต่ละ request แต่ละ doc ที่ส่งไปให้ elasticsearch มัน index หรือ query มันเกิดอะไรขึ้นบ้าง ข้อมูลแต่ละ bit แต่ละ byte มันเดินทางผ่านอะไร ไปทางไหน แล้วไปลงที่ไหน ต้องเข้าใจพฤติกรรมของระบบให้ดี เข้าใจว่า OS ทำงานยังไง ทั้งหมดนี้คือต้องนั่งอ่านเยอะมากๆ&#xA;&#xA;เมื่อเราเห็นเส้นทางของ data และเห็นวิธีการทำงานแล้ว เราจะนึกออกว่ามันช้าจุดไหน แล้วเราก็ค่อยไปหาว่ามันมีปุ่มหรือ setting ให้ tune หรือไม่ แล้วก็ลอง tune ดู&#xA;&#xA;#aws #elasticsearch]]&gt;</description>
      <content:encoded><![CDATA[<p>ที่บริษัทใช้ ELK (Elasticsearch, Logstash, Kibana) ทำระบบ centralize log และผมกำลังสนใจว่าอยากจะใช้ Elasticsearch ในการทำ time-series สำหรับ monitor ระบบไปด้วย เลยขอลงมาดูรายละเอียดงานด้วยตัวเองบ้าง</p>

<p>อันดับแรกคือทำอย่างไรให้ระบบ centralize log มีความเร็วเพียงพอต่อการ ingest log เข้าไป และจากนั้นค่อยดูว่าทำอย่างไรให้ query log/aggregate log data ได้รวดเร็ว</p>

<p>ตัวเลข stats ปัจจุบันที่ ELK แสดงมีดังนี้</p>
<ul><li>1,000,000 log lines in each minute (from Kibana)</li>
<li>100,000 average ingest rate per minute (from AWS)</li>
<li>9,200,000,000 searchable document (from AWS)</li></ul>



<p>Elasticsearch cluster ที่ใช้</p>
<ul><li>AWS Elasticsearch</li>
<li>3 x c5.large.elasticsearch – master node</li>
<li>2 x i3.2xlarge – Hot data node</li>
<li>8 x ultrawarm1.medium.elasticsearch</li></ul>

<h1 id="tuning-for-ingest"><strong>Tuning for ingest</strong></h1>

<p>team setup cluster ไว้ว่าเมื่อจะ ingest document ให้ไปเขียนลงในเครื่อง hot data node ดังนั้นจะมี 2 เครื่อง i3.2xlarge คอย handle ตรงนี้ เราเริ่มเจอปัญหา log delay เพราะ ingest จาก logstash เข้า elasticsearch ไม่ทัน จึงเริ่ม tuning</p>

<p>เริ่มจากทดลองเปิด i3.2xlarge เพิ่มอีก 1 เครื่องรวมเป็น 3 เครื่อง ก็ดีขึ้น แต่ดูแนวโน้มแล้วถ้าจำนวน log เพิ่มน่าจะไม่ไหวอยู่ดี จึงหาวิธี tune เพิ่มเติม</p>

<p>ไปดูกราฟ cluster status ต่างๆ เจอว่า CPU hot data node แตะ 100% ตลอดเวลา</p>

<p>ลองปรับ type ของแต่ละ field ให้ใช้เป็น keyword แทน text เพื่อที่จะได้ไม่ต้องเสียเวลา analyze ตรงนี้ไม่ช่วยเท่าไร จากนั้นลองเช็ค config index template ดู set ไว้ตามนี้</p>
<ul><li>index.refresh_interval = 60s</li>
<li>index.number<em>of</em>replicas = 0</li>
<li>index.number<em>of</em>shards = 6</li></ul>

<p>ทีมลองปรับ logstash batch size จากเดิม 400 เป็น 800 อันนี้เห็นว่าดีขึ้น ตัว logstash queue size ลดลงเร็วกว่าเดิม แต่ยังไม่ชัดมาก ลองดันขึ้นเป็น 1600 ก็ไม่ค่อยต่าง และ CPU ของ data node ยัง 100% เสมอ</p>

<p>ลองลดเครื่อง data node ลงเหลือ 2 เครื่องเหมือนเดิม แล้วลอง tune</p>

<p>ไปเจอว่ามี <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index-modules-translog.html#_translog_settings" rel="nofollow">translog setting</a> ที่น่าจะเกี่ยว เดาว่าจะช่วยลดการ sync ข้อมูลลง disk จะช่วยให้ index เร็วขึ้น ลอง setting ตามนี้</p>
<ul><li>index.translog.durability = async</li>
<li>index.translog.sync_interval = 1m</li></ul>

<p>ซึ่งคิดว่าเรายอมเสีย log 1 นาทีได้ถ้าเครื่องมัน crash ไป</p>

<p>หลังจาก tune แล้ว performance ดีขึ้นเยอะมาก ไม่มี queue รอ ingest อีกต่อไป และ CPU ของ elasticsearch ก็ไม่เต็ม 100% ตลอดเวลาอีกแล้ว</p>

<h1 id="tuning-for-query"><strong>Tuning for query</strong></h1>

<p>ผมมี plan ว่าอยากจะลองใช้ elasticsearch ทำ metric แบบ prometheus เพื่อประโยชน์ในเรื่องต่างๆ</p>
<ol><li>log กับ metric อยู่ใน storage เดียวกัน สามารถ query ร่วมกันได้</li>
<li>aggregate จาก raw data โดยตรงได้ โดยที่ไม่โดน down sampling แบบ prometheus</li>
<li>ถ้าเห็นว่า metric ตัวไหนมีปัญหา สามารถ query เจาดู raw data ได้ ซึ่ง prometheus ทำไม่ได้</li>
<li>เอาไปทำ distributed tracing ได้</li>
<li>สามารถ log metric อะไรลงไปก็ได้ผ่าน stdout โดยไม่ต้องทำ prometheus exporter</li></ol>

<p>ผมยังทำ metric ไปไม่ถึงจุดนั้น แต่ก็อยากจะดูไว้ก่อนว่าจะเจอปัญหาอะไรบ้าง เพราะจำนวน log lines per minute มันเยอะมากๆ นาทีละ 1,000,000 line ถ้าอยากจะดู time-series ยาวๆ สัก 24 ชั่วโมง ก็คง hit 1,440,000,000 doc ที่ต้อง query + aggregate ซึ่งไม่รู้ว่ามันจะไหวจริงๆ หรือเปล่า</p>

<p>ไปเจอบทความนึงเขียนไว้ค่อนข้างละเอียดเรื่องการ tune elasticsearch เลยอยากเอามา share</p>

<p><a href="https://medium.com/thousandeyes-engineering/what-we-learned-using-elasticsearch-as-a-time-series-database-bdbde38cdb64" rel="nofollow">https://medium.com/thousandeyes-engineering/what-we-learned-using-elasticsearch-as-a-time-series-database-bdbde38cdb64</a></p>

<h1 id="take-away"><strong>Take away</strong></h1>

<p>elasticsearch สามารถ tune ได้เยอะมากๆ ในจุดต่างๆ แต่ที่สำคัญที่สุดคือเราต้องนึกให้ออกว่าแต่ละ request แต่ละ doc ที่ส่งไปให้ elasticsearch มัน index หรือ query มันเกิดอะไรขึ้นบ้าง ข้อมูลแต่ละ bit แต่ละ byte มันเดินทางผ่านอะไร ไปทางไหน แล้วไปลงที่ไหน ต้องเข้าใจพฤติกรรมของระบบให้ดี เข้าใจว่า OS ทำงานยังไง ทั้งหมดนี้คือต้องนั่งอ่านเยอะมากๆ</p>

<p>เมื่อเราเห็นเส้นทางของ data และเห็นวิธีการทำงานแล้ว เราจะนึกออกว่ามันช้าจุดไหน แล้วเราก็ค่อยไปหาว่ามันมีปุ่มหรือ setting ให้ tune หรือไม่ แล้วก็ลอง tune ดู</p>

<p><a href="https://tnpl.me/tag:aws" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">aws</span></a> <a href="https://tnpl.me/tag:elasticsearch" class="hashtag" rel="nofollow"><span>#</span><span class="p-category">elasticsearch</span></a></p>
]]></content:encoded>
      <guid>https://tnpl.me/tuning-elasticsearch</guid>
      <pubDate>Sat, 06 Mar 2021 02:41:21 +0000</pubDate>
    </item>
  </channel>
</rss>