<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Performance Test &#8211; Few Steps &#8211; ก้าวสั้นๆ แต่ไปเรื่อยๆ</title>
	<atom:link href="https://myifew.com/tag/performance-test/feed/" rel="self" type="application/rss+xml" />
	<link>https://myifew.com</link>
	<description></description>
	<lastBuildDate>Mon, 11 May 2020 03:54:57 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://myifew.com/wp-content/uploads/2018/07/cropped-logo6-ts-32x32.png</url>
	<title>Performance Test &#8211; Few Steps &#8211; ก้าวสั้นๆ แต่ไปเรื่อยๆ</title>
	<link>https://myifew.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>ทดสอบความเร็ว .NET Core 3.1 (Official Runtimes) บน AWS Lambda</title>
		<link>https://myifew.com/5712/benchmark-netcore-31-aws-lambda/</link>
					<comments>https://myifew.com/5712/benchmark-netcore-31-aws-lambda/#respond</comments>
		
		<dc:creator><![CDATA[iFew]]></dc:creator>
		<pubDate>Sun, 10 May 2020 18:55:07 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[.Net Core]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[AWS Lambda]]></category>
		<category><![CDATA[Performance Test]]></category>
		<category><![CDATA[Serverless]]></category>
		<guid isPermaLink="false">https://myifew.com/?p=5712</guid>

					<description><![CDATA[วันที่ผมรอคอยก็มาถึง เมื่อ AWS ประกาศรองรับ .NET Core 3.1 เป็น Official Runtime ทำให้ Cold Start ลดลงกว่า 50%]]></description>
										<content:encoded><![CDATA[
<p>และแล้ว วันที่ผมรอคอย (รวมถึงชาว .NET Core บน. AWS Lambda) ก็มาถึง เมื่อ <a rel="noreferrer noopener" href="https://aws.amazon.com/blogs/compute/announcing-aws-lambda-supports-for-net-core-3-1/" target="_blank">AWS ประกาศรองรับ .NET Core 3.1 เป็น Official Runtime</a> แล้วจ้า (จริงๆ ประกาศตั้งแต่ 31 มีนาคม 2563 แต่ผมเห็นช้าไปหน่อย แหะๆ) ต้องขอทดสอบสักหน่อยว่าดีขึ้นแค่ไหน แต่เฉลยไว้ก่อนเลยว่า ลดเวลาการเกิด Cold Start จาก .NET Core 2.1 ได้ถึง 50% เลยทีเดียว</p>



<span id="more-5712"></span>



<p>ผมเคยเขียนในบล็อกเรื่อง <a href="https://myifew.com/5565/benchmark-netcore-3-and-readytorun-for-aws-lambda/">ทดสอบความเร็ว .NET Core 3.0 และฟีเจอร์ ReadyToRun (R2R) ในการทำ AWS Lambda</a> ซึ่งตอนนั้น ได้ทำเป็น Custom Runtime และผลลัพธ์ที่ได้ .NET Core 3.0 เร็วกว่า 2.1 นิดเดียว แทบไม่เห็นความต่าง ดีขึ้นแค่เสถียร เพราะมันไปช้าที่ AWS Custom Library ดังนั้นผมจึงแนะนำให้ทุกคนไปใช้ <a rel="noreferrer noopener" href="https://github.com/zaccharles/lambda-native" target="_blank">LambdaNative</a> แทน แต่ก็ยังมีปัญหาว่า <a rel="noreferrer noopener" href="https://github.com/dotnet/corert/issues/7386" target="_blank">Microsoft.DotNet.ILCompiler</a>&nbsp;ไม่รองรับการทำงานที่ซับซ้อน อย่างการเรียกใช้งาน Database ร่วมกับ EFCore หรือ Dapper จึงทำให้ต้องเลี่ยงไปใช้ต่อตรงด้วย ADO.NET  แทน</p>



<h2 class="wp-block-heading">ปัจจัยที่ทำให้ .NET Core 3.1 ทำงานได้ไวใน AWS Lambda</h2>



<p>จากที่ทดสอบเอง, ดู Benchmark, และอ่านๆ จากหลายแหล่ง พบว่ามีหลักๆ มี 2 เรื่อง ที่เป็นฟีเจอร์ใหม่ใน .NET Core 3 ที่ช่วยให้ AWS Lambda ทำงานได้ไวขึ้น คือ </p>



<ol class="wp-block-list"><li><strong>Built-in JSON support</strong> : ซึ่งปกติผู้เขียน C# เวลาต้องแปลง Object, Array ออกไปเป็น JSON จะต้องใช้ Library อย่างเช่น Newtonsoft.Json ซึ่งมันดีนะ แต่มันก็คือการจัดการ String บน .NET แบบ UTF-16 ซึ่งจะเปลืองทรัพยากรมากในการ convert ไปๆมาๆ<br><br>แต่สำหรับ .NET Core 3.0 เป็นต้นมา ได้ built-in JSON Converter เข้าไปเลย และทำงานแบบ UTF-8 encoder ตั้งแต่ต้น จึงไวขึ้น และเมื่อ Core มันมี JSON Converter มาแล้ว ก็ไม่ต้องเรียก 3rd Party Library จึงทำให้ AWS Lambda เราตัวเล็กลงด้วย (ดูการเปรียบเทียบ <a rel="noreferrer noopener" href="https://michaelscodingspot.com/the-battle-of-c-to-json-serializers-in-net-core-3/" target="_blank">The Battle of C# to JSON Serializers in .NET Core 3</a>)</li><li><strong>ReadyToRun</strong> :  เป็นฟีเจอร์ที่ Microsoft ภูมิใจนำเสนอมา ตั้งแต่ปล่อยตัว .NET Core 3.0 Preview 6 แล้ว นั่นคือทำให้ .NET Core application แปลงเป็น Native App ส่งผลให้มีการทำงานที่ไวขึ้น มี startup time ที่ดีขึ้น (AOT – ahead-of-time) เพราะไปลดปริมาณงานที่ต้องแปลง Byte Code เป็น Executable Code ลง (JIT – Just in Time)</li></ol>



<p>ดังนั้น แม้ว่า 3.1 จะเร็วขึ้นมาบ้าง แต่ก็ยังแนะนำให้ทำ AWS Lambda เป็น ReadyToRun นะครับ</p>



<h2 class="wp-block-heading">การ Migrate ไปใช้ .NET Core 3.1 Runtime บน AWS Lambda</h2>



<p>แก้แค่ 3 จุดหลักๆ (ส่วนโค้ดอื่นๆ ที่ไม่รองรับหลังจากทำ 3+1 ข้อนี้ ก็ไปตามแก้กันต่ออีกนะ)</p>



<h4 class="wp-block-heading">1. เปลี่ยน Target Framework ใหม่</h4>



<pre class="wp-block-code"><code>&lt;TargetFramework>netcoreapp3.1&lt;/TargetFramework></code></pre>



<h4 class="wp-block-heading">2. <strong>เปลี่ยนการเรียกใช้ JSON ใหม่</strong></h4>



<p>ใช้ JSON Package ใหม่ชื่อ</p>



<pre class="wp-block-code"><code>Amazon.Lambda.Serialization.SystemTextJson</code></pre>



<p>และระบุใน Class Handler ใหม่เป็น</p>



<pre class="wp-block-code"><code>&#91;assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]</code></pre>



<h4 class="wp-block-heading">3. ใน Deployment Config เปลี่ยน Function Runtime ใหม่ (aws-lambda-tools-defaults.json)</h4>



<pre class="wp-block-code"><code>"framework" : "netcoreapp3.1",
"function-runtime":"dotnetcore3.1",</code></pre>



<h4 class="wp-block-heading">ในกรณี ต้องการทำเป็น ReadyToRun จะต้องเพิ่มใน Csproj file ด้วยดังนี้</h4>



<pre class="wp-block-code"><code>&lt;PublishReadyToRun>true&lt;/PublishReadyToRun>
&lt;TieredCompilation>false&lt;/TieredCompilation>
&lt;TieredCompilationQuickJit>false&lt;/TieredCompilationQuickJit></code></pre>



<p>ที่ต้องปิด Tiered Compilation เพราะจะเกิด Startup Time สูงขึ้น และใช้ Memory เยอะขึ้นโดยใช่เหตุ (อ้างอิง Performance จาก <a href="https://medium.com/@zaccharles/net-core-3-0-aws-lambda-benchmarks-and-recommendations-8fee4dc131b0">.NET Core 3.0 AWS Lambda Benchmarks and Recommendations</a> และหากใครต้องการเข้าใจ <a href="https://docs.microsoft.com/en-us/dotnet/core/whats-new/dotnet-core-3-0#tiered-compilation">What&#8217;s new in .NET Core 3.0</a>)</p>



<p>และถ้าจะใช้ ReadyToRun จะต้อง Build และ Publish เป็น Linux Runtime นะครับ ไม่สามารถ Build Image บน Windows/Mac แล้วเอาขึ้นไปทำงานบน AWS Lambda ได้ เนื่องจากบนนั้นจะเป็น Amazon Linux 2 (ไปดูลิงค์ Demo ของผมที่ด้านล่างได้ ว่าทำอย่างไร)</p>



<h2 class="wp-block-heading">ผลทดสอบ Cold Start ของ AWS Lambda .NET Core 2.1 เมื่อเทียบกับ 3.1 และ 3.1 ReadyToRun</h2>



<p>ผมใช้โค้ดทดสอบตัวเดิมกับที่เคยทดสอบในบล็อก <a href="https://myifew.com/5565/benchmark-netcore-3-and-readytorun-for-aws-lambda/">ทดสอบความเร็ว .NET Core 3.0 และฟีเจอร์ ReadyToRun (R2R) ในการทำ AWS Lambda</a> ซึ่งได้ลองรัน 2.1 ก่อน จากนั้น migrate ไปเป็น 3.1 เพื่อเก็บข้อมูล และสุดท้ายก็ Compile ไปเป็น 3.1 ReadyToRun เพื่อเก็บข้อมูล</p>



<p>โดยการทำงานของโค้ดจะมีการเชื่อมต่อ MySQL Database 5.6 โดยมี table ชื่อ members ที่มี 3 รายการ (ค่าจะผันผวนบ้าง อาจเกิดจากการเรียกใช้ MySQL Database)</p>



<figure class="wp-block-image size-large"><img fetchpriority="high" decoding="async" width="1602" height="374" src="https://myifew.com/wp-content/uploads/2020/05/compare-aws-lambda-netcore21-31-31r2r.png" alt="" class="wp-image-5715"/></figure>



<p>จะสังเกตได้ว่า แค่แปลงไปใช้ Runtime 3.1 และ Built-in JSON ก็ลดเวลาการเกิด Cold Start ลงไปหนึ่งเท่าตัวเลยทีเดียว </p>



<p>และเมื่อทำเป็น 3.1 ReadyToRun ก็เร็วขึ้นอีกราวๆ 100ms และเมื่อเพิ่ม config เพื่อปิดการใช้ Tiered Compilation ก็ทำให้เร็วขึ้นไปอีก 100-300ms เมื่อใช้ Memory 128MB และ 256MB</p>



<p>แต่มีข้อสังเกตว่า การทำ ReadyToRun มีความเสถียรขึ้น รันครั้งที่ 2 เป็นต้นไป ไม่เจอว่าเกิน 100ms เลย (อย่าลืมว่า AWS Lambda คิดเงินทุกๆ 100ms ดังนั้นเมื่อเกิน มันจะปัดเศษขึ้นไปเป็นอีก 100ms) ส่วนความเร็วที่ผันผวนขึ้นลง 3-5ms ผมคิดว่ามีความต่างน้อยมากๆ ไม่จำเป็นต้องใส่ใจก็ได้ ถ้างานเราไม่ได้ซีเรียสกับเวลาแค่นี้</p>



<p>และเมื่อเราไม่ใช้ LambdaNative กับ <a rel="noreferrer noopener" href="https://github.com/dotnet/corert/issues/7386" target="_blank">Microsoft.DotNet.ILCompiler</a>&nbsp; ตัวปัญหาแล้ว มันจึงทำให้เราใช้ Library ต่างๆ อย่าง Dapper ได้แล้วครับ ไม่ต้องใช้ ADO มา  Mapping Object เองอีกต่อไป แต่ก็ต้องแลกกับเวลาที่มากขึ้นอีก 15-30%</p>



<figure class="wp-block-image size-large"><img decoding="async" width="698" height="346" src="https://myifew.com/wp-content/uploads/2020/05/compare-aws-lambda-netcore31r2r-dapper.png" alt="" class="wp-image-5716"/></figure>



<h2 class="wp-block-heading">สรุป</h2>



<p>ใครใช้ .NET Core 2.1 บน AWS Lambda อยู่ หรือใช้ LambdaNative หรือใช้ Custom Runtime ตามที่ผมเคยเขียนถึง แนะนำให้เปลี่ยนมาใช้ .NET Core 3.1 ของ AWS Official Runtime ครับ ไวกว่ามาก และถ้าเป็นไปได้ ก็ควรทำให้เป็น ReadyToRun Image ด้วย เพื่อประสิทธิภาพที่ดีขึ้นครับ</p>



<p>ส่วนใครอยากลองดูโค้ดตัวอย่าง ดูได้จากด้านล่างนี้เลย</p>



<p><strong>Code Demo</strong></p>



<ul class="wp-block-list"><li><a rel="noreferrer noopener" href="https://github.com/ifew/aws-lambda-db" target="_blank">AWS Lambda .NET Core 3.1 แบบธรรมดา</a></li><li><a rel="noreferrer noopener" href="https://github.com/ifew/aws-lambda-db-r2r" target="_blank">AWS Lambda .NET Core 3.1 แบบทำเป็น ReadyToRun</a></li><li><a rel="noreferrer noopener" href="https://github.com/ifew/aws-lambda-dapper-r2r" target="_blank">AWS Lambda .NET Core 3.1 แบบทำเป็น ReadyToRun และใช้ Dapper ในการเรียกใช้งาน MySQL Database</a></li></ul>



<p><strong>อ้างอิง</strong></p>



<ul class="wp-block-list"><li><a href="https://aws.amazon.com/blogs/compute/announcing-aws-lambda-supports-for-net-core-3-1/">https://aws.amazon.com/blogs/compute/announcing-aws-lambda-supports-for-net-core-3-1/</a></li><li><a href="https://docs.microsoft.com/en-us/dotnet/core/whats-new/dotnet-core-3-0">https://docs.microsoft.com/en-us/dotnet/core/whats-new/dotnet-core-3-0</a></li><li><a href="https://medium.com/@zaccharles/a-close-look-at-net-core-3-1-on-aws-lambda-9ccec4dd96be">https://medium.com/@zaccharles/a-close-look-at-net-core-3-1-on-aws-lambda-9ccec4dd96be</a></li><li><a href="https://vincepergolizzi.com/programming/2020/04/01/dotnet-core-3.1-lambda.html">https://vincepergolizzi.com/programming/2020/04/01/dotnet-core-3.1-lambda.html</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://myifew.com/5712/benchmark-netcore-31-aws-lambda/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>แนะนำ k6 สำหรับทำ Load  Testing และ Automation Testing</title>
		<link>https://myifew.com/5669/k6-load-testing-tool/</link>
					<comments>https://myifew.com/5669/k6-load-testing-tool/#respond</comments>
		
		<dc:creator><![CDATA[iFew]]></dc:creator>
		<pubDate>Thu, 02 Apr 2020 17:41:51 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Performance Test]]></category>
		<category><![CDATA[Testing Tools]]></category>
		<guid isPermaLink="false">https://myifew.com/?p=5669</guid>

					<description><![CDATA[ในบรรดาเครื่องมือ Load Test ที่เรารู้จักกันคงหนีไม่พ้น ab (ApacheBench) และ Apache jMeter โพสต์นี้จะมาแนะนำอีกตัวหนึ่ง ที่ Developer น่าจะชอบเลย ชื่อว่า k6 ครับ Performance Testing,&#8230;]]></description>
										<content:encoded><![CDATA[
<p>ในบรรดาเครื่องมือ Load Test ที่เรารู้จักกันคงหนีไม่พ้น <a href="http://httpd.apache.org/docs/2.4/programs/ab.html">ab (ApacheBench)</a> และ <a href="https://jmeter.apache.org/">Apache jMeter</a> โพสต์นี้จะมาแนะนำอีกตัวหนึ่ง ที่ Developer น่าจะชอบเลย ชื่อว่า <a href="https://k6.io/">k6</a> ครับ</p>



<span id="more-5669"></span>



<h2 class="wp-block-heading">Performance Testing, Load Testing กับ Stress Testing ต่างกันอย่างไร</h2>



<p>ก่อนจะไปถึงเครื่องมือ มาทำความเข้าใจกันก่อนว่า Test ทั้ง 3 ตัวนี้ ต่างกันอย่างไร </p>



<figure class="wp-block-image size-large"><img decoding="async" width="774" height="467" src="https://myifew.com/wp-content/uploads/2020/04/performance-test-type.png" alt="" class="wp-image-5681"/></figure>



<p>ต้องบอกว่า Load Testing และ Stress Testing เป็นส่วนหนึ่งใน Performance Testing ซึ่งคือ การที่เราทดสอบในแง่มุมต่างๆ เพื่อบ่งบอกประสิทธิภาพของระบบ เช่น</p>



<ul class="wp-block-list"><li>ระบบมีการทำงานได้เร็วไหม? ความเร็วเท่าไร? ที่จำนวน Request แต่ละชุด (Load Testing)</li><li>ถ้าระบบทำงานหนักๆ ติดต่อกันนาน จะเกิดปัญหาไหม? (Endurance Testing)</li><li>ถ้าระบบทำงานหนักมากๆ จนล่ม สามารถกลับมาทำงานได้ไหม? ใช้เวลากลับมา นานแค่ไหน? (Recovery Testing)</li><li>ถ้าระบบทำงานสูงขึ้นเรื่อยๆ แบบเกินปกติ จะรองรับได้ที่เท่าไร? (Stress Testing)</li><li>ถ้าระบบมีการใช้งานพุ่งสูงแบบกระทันหัน จะเกิดปัญหาไหม? (Spike Testing)</li></ul>



<p>จริงๆ มีมากกว่านี้ แต่จากรายการข้างต้น เรียกว่าเป็นกลุ่มของ Non-Functional Testing ที่ไม่ได้เห็น Bug ชัดเจนจากการเขียนโปรแกรมที่ผิดพลาด จึงอาจต้องอาศัยคนหรือเครื่องมือเพื่อจำลองสถานการณ์ขึ้นมา ว่าได้ตามเกณฑ์ที่กำหนดหรือเปล่า</p>



<h2 class="wp-block-heading">รู้จักกับ k6 &#8211; Open source load testing tool</h2>



<p><a href="https://k6.io/">k6</a> เป็นเครื่องมือ Open source ที่เขียนด้วยภาษา Go สำหรับทำ Load Testing โดยทำคำสั่งผ่าน CLI คล้ายกับ <a href="http://httpd.apache.org/docs/2.4/programs/ab.html">ab (ApacheBench)</a> แต่ด้วยความที่มันเป็น Scriptable tools เลยทำให้สามารถเขียนโค้ดทดสอบเพิ่มเติมได้ โดยใช้ภาษา Javascript  และแน่นอน มันจึงทำ Automated Testing ได้สะดวกขึ้น และน่าจะถูกใจชาว Developer ด้วย</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1256" height="486" src="https://myifew.com/wp-content/uploads/2020/04/k6-sample-api-test.png" alt="" class="wp-image-5670"/></figure>



<p><strong>อธิบายเพิ่มเติม:</strong> <a href="http://httpd.apache.org/docs/2.4/programs/ab.html">ab (ApacheBench)</a> เป็นเครื่องมือประเภท Non-Scriptable ข้อดีคือใช้งานง่าย เพียงพิมพ์คำสั่งและตามด้วย parameter ที่กำหนด ก็ใช้งานได้เลย เหมาะกับคนทั่วไปที่ไม่ต้องเขียนโค้ดเป็น แต่ข้อเสียคือ ไม่สามารถทำอะไรได้นอกเหนือจาก parameter ที่มีให้ ตัวอย่างเช่น</p>



<pre class="wp-block-code"><code>ab -n 100 -c 10 http://www.website.com/ -H "clientId:1234" -H  "token:a2ds5mvo93mcnsk3ncsju3nxdl"</code></pre>



<p>ส่วนเครื่องมือที่นิยมอีกตัวหนึ่ง คือ <a href="https://jmeter.apache.org/">Apache jMeter</a> ที่สามารถเขียนคำสั่งได้ด้วย XML แต่ก็ต้องทำภายใต้ข้อจำกัดของ XML Syntax ที่เขาเตรียมไว้ให้</p>



<h2 class="wp-block-heading">วิธีติดตั้ง k6</h2>



<p>k6 รองรับการใช้งาน 3 ระบบ เลือกติดตั้งตามความเหมาะสมได้เลยครับ</p>



<h4 class="wp-block-heading">สำหรับชาว Linux (deb and rpm packages)</h4>



<pre class="wp-block-code"><code>sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 379CE192D401AB61
echo "deb https://dl.bintray.com/loadimpact/deb stable main" | sudo tee -a /etc/apt/sources.list
sudo apt-get update
sudo apt-get install k6</code></pre>



<h4 class="wp-block-heading" id="windows-msi-installer">สำหรับชาว Mac (brew)</h4>



<pre class="wp-block-code"><code>brew install k6</code></pre>



<h4 class="wp-block-heading" id="windows-msi-installer">สำหรับชาว Windows (MSI installer)</h4>



<p>ไปโหลดได้ที่:&nbsp;<a href="https://dl.bintray.com/loadimpact/windows/k6-v0.26.1-amd64.msi">https://dl.bintray.com/loadimpact/windows/k6-v0.26.1-amd64.msi</a><br>หรือเข้าไปดู release ล่าสุดได้ที่ <a href="https://github.com/loadimpact/k6/releases">https://github.com/loadimpact/k6/releases</a></p>



<h4 class="wp-block-heading">ติดตั้งใช้งานผ่าน Docker</h4>



<pre class="wp-block-code"><code>docker pull loadimpact/k6</code></pre>



<h2 class="wp-block-heading">เริ่มต้นทดสอบ Load Testing ด้วย k6 อย่างง่าย</h2>



<p>ลองมาทดสอบด้วยการส่ง Request ไปหาเว็บไซต์ <a href="http://test.k6.io">http://test.k6.io</a> กัน โดยการสร้างไฟล์ k6-script.js ขึ้นมา และใส่โค้ดไปดังนี้</p>



<pre class="wp-block-code"><code>import http from 'k6/http';
import { sleep } from 'k6';

export default function() {
  http.get('http://test.k6.io');
  sleep(1);
}</code></pre>



<p>จากนั้นทำการ run ชุดโค้ดทดสอบด้วยคำสั่ง ดังนี้</p>



<pre class="wp-block-code"><code>k6 run k6-script.js</code></pre>



<p>จะได้ผลลัพธ์ออกมาแบบนี้ครับ</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2020" height="938" src="https://myifew.com/wp-content/uploads/2020/04/k6-sample-load-web.png" alt="" class="wp-image-5674"/></figure>



<p>โดยที่ค่าสำคัญๆ ที่เราจะใช้ดู คือ</p>



<ul class="wp-block-list"><li><strong>duration</strong> : เวลาที่จะใช้ทดสอบ (ในที่นี้ไม่ได้ระบุ จึงไม่ได้ใช้)</li><li><strong>iterations</strong> : จำนวนครั้ง request ที่ใช้ทดสอบ (ในที่นี้ไม่ได้ระบุ จึงเป็นค่า 1)</li><li><strong>vus</strong> : ย่อมาจาก virtual user หรือการจำลองคนใช้งาน 1 คน (ในที่นี้ไม่ได้ระบุ จึงเป็นค่า 1)</li><li><strong>max</strong> : คือจำนวน vus มากที่สุดที่จะใช้ทดสอบ โดยจะใช้ระบุคู่กับ duration เท่านั้น (ในที่นี้ไม่ได้ระบุ จึงเป็นค่า 1) และในการทำ stage จะใช้ชื่อว่า <strong>target</strong></li><li><strong>data_received</strong> : จำนวน Byte ที่มีการรับกลับมาจากการทดสอบ</li><li><strong>data_sent</strong> : จำนวน Byte ที่มีการส่งออกไปเพื่อทดสอบ</li><li><strong>http_req_duration</strong> : จำนวนเวลารวมที่มีการ request ทดสอบ (ผลรวมของ  http_req_sending + http_req_waiting + http_req_receiving)</li><li><strong>http_reqs</strong> : จำนวนครั้งที่มี request ในช่วงเวลา duration ที่กำหนด</li></ul>



<p>ส่วนค่าอื่นๆ อ่านคำอธิบายได้จากที่นี่ครับ <a href="https://k6.io/docs/getting-started/results-output">https://k6.io/docs/getting-started/results-output</a></p>



<h2 class="wp-block-heading">ลองใส่ k6 Parameters ง่ายๆ เพื่อกำหนดรูปแบบการทดสอบ</h2>



<p>กำหนดให้ vus เป็น 10 และ duration time เป็น 30 วินาที</p>



<pre class="wp-block-code"><code>k6 run --vus 10 --duration 30s k6-script.js</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2026" height="934" src="https://myifew.com/wp-content/uploads/2020/04/k6-sample-test-vus-duration.png" alt="" class="wp-image-5675"/></figure>



<p>กำหนดให้ vus เป็น 10 และขยับขึ้นไปที่ 20 ภายในเวลา 30 วินาที</p>



<pre class="wp-block-code"><code>k6 run --vus 10 --duration 30s --max 20 k6-script.js</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2018" height="938" src="https://myifew.com/wp-content/uploads/2020/04/k6-sample-test-vus-duration-max.png" alt="" class="wp-image-5678"/></figure>



<p>กำหนดให้ vus เป็น 10 และ iteration เป็น 100 ครั้ง (หมายถึง 1 vus ทำการ request 10 ครั้ง)</p>



<pre class="wp-block-code"><code>k6 run --vus 10 --iterations 100 k6-script.js</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2022" height="930" src="https://myifew.com/wp-content/uploads/2020/04/k6-sample-test-vus-iterations.png" alt="" class="wp-image-5676"/></figure>



<p>ข้อมูล Parameters ต่างๆ สามารถดูเพิ่มเติมได้ที่นี่ครับ <a href="https://k6.io/docs/using-k6/options">https://k6.io/docs/using-k6/options</a></p>



<h2 class="wp-block-heading">เปลี่ยนจากการระบุ Parameters รูปแบบการทดสอบ มาเป็นเขียนโค้ด</h2>



<p>parameter ต่างๆ เราสามาถเขียนในรูปแบบโค้ด ใน Javascript เราได้ด้วยนะครับ เช่น</p>



<pre class="wp-block-code"><code>import http from 'k6/http';
import { sleep } from 'k6';

export let options = {
  vus: 10,
  iterations: 100,
};

export default function() {
  http.get('http://test.k6.io');
  sleep(1);
}</code></pre>



<p>จากนั้นก็สั่ง run โค้ด แบบไม่ต้องระบุ parameter ก็จะได้ผลลัพธ์เหมือนกัน</p>



<pre class="wp-block-code"><code>k6 run k6-script.js</code></pre>



<p>รูปแบบการใช้งานต่างๆ อ่านได้จากที่นี่ครับ <a href="https://k6.io/docs/getting-started/running-k6">https://k6.io/docs/getting-started/running-k6</a> และสามารถดู Options ต่างๆ ได้ที่นี่ครับ <a href="https://k6.io/docs/using-k6/options">https://k6.io/docs/using-k6/options</a></p>



<h2 class="wp-block-heading">ทดสอบ Load Testing แบบ Stages ด้วยการกำหนดจำนวน vus ให้ขึ้นลงตามระยะเวลาที่กำหนด</h2>



<p>บางทีเราต้องการจำลองการทดสอบจำนวนคนเข้า (vus) ในแต่ละช่วงเวลาไม่เท่ากัน จะขยับขึ้น (ramping up) จะลง (ramping down)  หรือจะขึ้นไปเรื่อยๆ ก็สามารถระบุเป็น Stages ได้ เช่น</p>



<p>ต้องการทดสอบโดยให้ vus มีประมาณจาก 1 ไป 20 vus ภายในเวลา 30 วินาที จากนั้นให้ลดลงมาที่ 10 vus ภายในเวลา 1:30นาที และลดลงเป็น 0 ภายในเวลา 20 วินาที จะเขียนโค้ด ดังนี้</p>



<pre class="wp-block-code"><code>import http from 'k6/http';
import { sleep } from 'k6';

export let options = {
  stages: [
    { duration: '30s', target: 20 },
    { duration: '1m30s', target: 10 },
    { duration: '20s', target: 0 },
  ],
};

export default function() {
  http.get('http://test.k6.io');
  sleep(1);
}</code></pre>



<p>ผลลัพธ์ที่ได้คือ ทดสอบจำนวน 2:20 นาที มี requests ได้ถึง 1,394 ครั้ง</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2022" height="936" src="https://myifew.com/wp-content/uploads/2020/04/k6-load-testing-stages.png" alt="" class="wp-image-5677"/></figure>



<h2 class="wp-block-heading">ทดสอบส่งค่าผ่าน HTTP Request และทำการเช็คผลลัพธ์ที่ได้</h2>



<p>ได้ลอง Get data ไปแล้ว คราวนี้มาลองส่ง Input data ผ่าน Post บ้าง และระบุ Header ด้วย จากนั้นจะต้องได้ผลลัพธ์ตามที่เรากำหนด ซึ่งจะมีรูปแบบการเขียนดังนี้</p>



<pre class="wp-block-code"><code>import { check } from "k6";
import http from 'k6/http';

export default function() {
  var url = 'http://test.loadimpact.com/login.php';
  var formdata = {
    login: 'admin',
    password: '123',
  };

  var params = {
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded'
    },
    redirects: 1
  };

  let res = http.post(url, formdata, params);
  let jar = http.cookieJar();
  let cookies = jar.cookiesForURL(url);

  check(res, {
    "is status 200": r => r.status === 200,
    "has cookie 'sid'": (r) => cookies.sid.length > 0,
    "has cookie 'uid'": (r) => cookies.uid.length > 0,
    "cookie 'sid' has correct value": (r) => cookies.sid == "39b77ac6-39c4-4c43-98b3-6b2816682036",
    "cookie 'uid' has correct value": (r) => cookies.uid == "3221"
 });

}</code></pre>



<p>ผลลัพธ์ที่ได้คือ</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="2024" height="1132" src="https://myifew.com/wp-content/uploads/2020/04/k6-load-testing-http.png" alt="" class="wp-image-5679"/></figure>



<p>ในตัวอย่าง ผมได้ทดสอบการ login เข้าสู่ระบบ โดยส่ง login, password ผ่าน form data ไปให้ url จากนั้น ทำการตรวจสอบความถูกต้อง 5 เรื่อง คือ</p>



<ul class="wp-block-list"><li>ได้ HTTP Status Codes คือกลับมาเป็น 200 หรือไม่</li><li>มี Cookie ชื่อ sid หรือไม่</li><li>มี Cookie ชื่อ uid หรือไม่</li><li>Cookie ชื่อ sid มีค่าที่ต้องการหรือไม่</li><li>Cookie ชื่อ uid มีค่าที่ต้องการหรือไม่</li></ul>



<p>ซึ่ง จากผลลัพธ์ สามารถเรียกใช้งานได้ และมีความถูกต้อง 5 เรื่อง ข้างต้นด้วย</p>



<p>ซึ่งถ้าผมอยากทำ Load Testing ระบบ login นี้ด้วยการจำลองสัก 10 vus จำนวน 100 ครั้ง ก็ใช้คำสั่งที่เราเคยลองทำมาคือ</p>



<pre class="wp-block-code"><code>k6 run --vus 10 --iterations 100 k6-script-http.js </code></pre>



<h2 class="wp-block-heading">สรุป</h2>



<p>จากที่ได้ลองเล่น k6 ดู ผมชอบตรงที่สามารถเขียนโค้ดการทดสอบได้ (Scriptable) และเขียนด้วยภาษา Javascript ที่นักพัฒนาเว็บไซต์ในโลกส่วนใหญ่มักจะเขียนเป็นกันอยู่แล้ว รวมไปถึง ตัว k6 เอง ใช้ภาษา Go ที่มีความสามารถในการทำงานที่เร็วและไม่กิน Memory มากนัก คิดว่าต่อไปคงได้เปลี่ยนจาก ApacheBench มาใช้ k6 แทน อย่างไม่ต้องสงสัยเลยครับ </p>



<p>ใครสนใจ สามารถไปดูข้อมูลเพิ่มเติมต่อได้ที่ <a href="https://k6.io/">https://k6.io/</a></p>



<p>ใครอยากได้ Demo ที่ผมทดสอบ หาได้จากที่นี่ครับ <a rel="noreferrer noopener" href="https://github.com/ifew/k6-load-testing" target="_blank">https://github.com/ifew/k6-load-testing</a></p>



<p>ส่วนใครอยากดูผลการ Benchmark ทดสอบเครื่องมือ Load Tesing สามารถดูได้ที่ <a href="https://k6.io/blog/comparing-best-open-source-load-testing-tools">https://k6.io/blog/comparing-best-open-source-load-testing-tools</a> (ดูข้อมูลและกราฟทดสอบก็พอ อย่าไปเชื่อผลสรุปมันมาก เพราะค่อนข้างลำเอียง อารมณ์ล้วนๆ จากคนเขียน k6 เอง ฮ่าๆ)</p>



<figure class="wp-block-image size-large"><img loading="lazy" decoding="async" width="1678" height="858" src="https://myifew.com/wp-content/uploads/2020/04/k6-MemoryPerRequest.png" alt="" class="wp-image-5680"/></figure>



<p>Reference</p>



<ul class="wp-block-list"><li><a href="https://k6.io/">https://k6.io/</a></li><li><a href="https://k6.io/blog/comparing-best-open-source-load-testing-tools/">https://k6.io/blog/comparing-best-open-source-load-testing-tools/</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://myifew.com/5669/k6-load-testing-tool/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>ทดสอบความเร็ว .NET Core 3.0  และฟีเจอร์ ReadyToRun (R2R) ในการทำ AWS Lambda</title>
		<link>https://myifew.com/5565/benchmark-netcore-3-and-readytorun-for-aws-lambda/</link>
					<comments>https://myifew.com/5565/benchmark-netcore-3-and-readytorun-for-aws-lambda/#respond</comments>
		
		<dc:creator><![CDATA[iFew]]></dc:creator>
		<pubDate>Tue, 01 Oct 2019 19:20:35 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[.Net Core]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[AWS Lambda]]></category>
		<category><![CDATA[Performance Test]]></category>
		<category><![CDATA[Serverless]]></category>
		<guid isPermaLink="false">https://myifew.com/?p=5565</guid>

					<description><![CDATA[เมื่อ 23 กันยายน ที่ผ่านมา Microsoft ได้ฤกษ์เปิดตัว .NET Core 3.0 (3.0.100) ตัวเต็มให้ได้เล่นกัน หลังจากเป็นข่าวมาร่วมปี ซึ่งมาพร้อมกับฟีเจอร์และพัฒนา Performance จากเวอร์ชัน 2.2 เยอะพอสมควร ใครอยากรู้รายละเอียดสามารถไปตามอ่านได้ที่&#8230;]]></description>
										<content:encoded><![CDATA[
<p>เมื่อ 23 กันยายน ที่ผ่านมา <a rel="noreferrer noopener" aria-label="Microsoft ได้ฤกษ์เปิดตัว .NET Core 3.0 (opens in a new tab)" href="https://devblogs.microsoft.com/dotnet/announcing-net-core-3-0/" target="_blank">Microsoft ได้ฤกษ์เปิดตัว .NET Core 3.0</a> (3.0.100) ตัวเต็มให้ได้เล่นกัน หลังจากเป็นข่าวมาร่วมปี ซึ่งมาพร้อมกับฟีเจอร์และพัฒนา Performance จากเวอร์ชัน 2.2 เยอะพอสมควร ใครอยากรู้รายละเอียดสามารถไปตามอ่านได้ที่ <a rel="noreferrer noopener" aria-label="Announcing .NET Core 3.0 (opens in a new tab)" href="https://devblogs.microsoft.com/dotnet/announcing-net-core-3-0/" target="_blank">Announcing .NET Core 3.0</a></p>



<p>ในครั้งนี้มีฟีเจอร์หนึ่งที่น่าสนใจคือ ReadyToRun (R2R) ซึ่งจริงๆ มันมาตั้งแต่ .NET Core 3 Preview 6 แล้ว นั่นคือทำให้ .NET Core application แปลงเป็น Native App ให้ไวขึ้น ส่งผลกับ startup time ที่ดีขึ้น (AOT &#8211; ahead-of-time) จากแต่เดิมซึ่งมีเพียงแค่ แปลง Byte Code เป็น Executable Code  (JIT &#8211; Just in Time)</p>



<p>ผมนี่ตาลุกวาวทันที ไม่รอช้าที่จะหยิบมันมาทดสอบเป็น AWS Lambda เพื่อดูปัญหา Cold Start ว่าจะดีขึ้นได้มากน้อยแค่ไหน</p>



<span id="more-5565"></span>



<h2 class="wp-block-heading">เริ่มต้นใช้ ReadyToRun (How to Use)</h2>



<p>วิธีการใช้ ReadyToRun  ไม่ยาก แค่ตั้ง Config ในไฟล์ csproj ได้เลย ตัวอย่างที่ผมใช้จะประมาณนี้</p>



<pre class="wp-block-code"><code>&lt;PropertyGroup>
    &lt;OutputType>Exe&lt;/OutputType>
    &lt;TargetFramework>netcoreapp3.0&lt;/TargetFramework>
    &lt;LangVersion>latest&lt;/LangVersion>
    &lt;AWSProjectType>Lambda&lt;/AWSProjectType>
    &lt;PublishReadyToRun>true&lt;/PublishReadyToRun>
    &lt;PublishTrimmed>true&lt;/PublishTrimmed>
    &lt;PublishSingleFile>true&lt;/PublishSingleFile>
&lt;/PropertyGroup></code></pre>



<p>Config R2R ที่ใช้บ่อย จะมี ดังนี้</p>



<ul class="wp-block-list"><li><strong>PublishReadyToRun</strong>&nbsp;คือ บอกให้แอพเรา Publish เป็น ReadyToRun Image</li><li><strong>PublishTrimmed</strong>&nbsp;คือ ตัด assemblies ที่ไม่ได้ใช้ออกไป ซึ่งจะช่วยลดขนาดไฟล์ได้ (โดยจะวิเคราะห์ IL จาก Library ที่ชื่อว่า&nbsp;<a rel="noreferrer noopener" href="https://github.com/mono/linker" target="_blank">IL linker</a>&nbsp;สามารถไปดู Docs เพื่อกำหนดค่าต่างๆได้)</li><li><strong>PublishSingleFile</strong>&nbsp;คือ บอกว่าจะ Publish โดยแพ็คมาให้เป็น Executable File ไฟล์เดียว (ดูข้อมูลเพิ่มเติมได้ที่ <a href="https://github.com/dotnet/designs/blob/master/accepted/single-file/design.md" target="_blank" rel="noreferrer noopener" aria-label="design (opens in a new tab)">design</a>)</li></ul>



<p>และเวลา publish จะต้องระบุ RuntimeIdentifier ด้วย เช่น</p>



<pre class="wp-block-code"><code>dotnet publish -r win-x64 -c Release</code></pre>



<p>ดู Runtime เพิ่มเติมได้ที่ <a rel="noreferrer noopener" aria-label=".NET Core Runtime IDentifier (RID) catalog (opens in a new tab)" href="https://docs.microsoft.com/en-us/dotnet/core/rid-catalog" target="_blank">.NET Core Runtime IDentifier (RID) catalog</a></p>



<h2 class="wp-block-heading">วิธีการทดสอบ (Test Scenarios)</h2>



<p>ผมเคยทดสอบ AWS Lambda เพื่อแก้ปัญหา Cold Start ด้วยหลายๆ วิธี (อ่านเพิ่มเติมได้จาก <a rel="noreferrer noopener" aria-label="9 วิธีจัดการกับ Cold Start ใน Serverless ให้ทำงานได้ไวที่สุด พร้อมตัวอย่าง (opens in a new tab)" href="https://myifew.com/5386/9-ways-to-fighting-with-cold-start-in-serverless/" target="_blank">9 วิธีจัดการกับ Cold Start ใน Serverless ให้ทำงานได้ไวที่สุด พร้อมตัวอย่าง</a>) ครั้งนี้ผมจึงอ้างอิงจากโค้ดชุดเดิม โดยจะทดสอบ 3 Scenarios ดังนี้</p>



<ol class="wp-block-list"><li>ชุดโค้ด .NET Core Dll file ปกติ ที่เปลี่ยน Version จาก AWS Standard Runtime .NET Core 2.1 มาเป็นทำ Custom Runtime ขึ้นมาเองด้วย .NET Core 3.0.100 ผ่านไลบรารี่ <a rel="noreferrer noopener" aria-label="Amazon.Lambda.RuntimeSupport (opens in a new tab)" href="https://aws.amazon.com/blogs/developer/announcing-amazon-lambda-runtimesupport/" target="_blank">Amazon.Lambda.RuntimeSupport</a></li><li>ชุดโค้ด .NET Core Native ที่ใช้ไลบรารี่ <a rel="noreferrer noopener" aria-label="LambdaNative (opens in a new tab)" href="https://github.com/zaccharles/lambda-native" target="_blank">LambdaNative</a> และ <a rel="noreferrer noopener" aria-label="Microsoft.DotNet.ILCompiler (opens in a new tab)" href="https://dotnet.myget.org/feed/dotnet-core/package/nuget/Microsoft.DotNet.ILCompiler" target="_blank">Microsoft.DotNet.ILCompiler</a> แต่เปลี่ยน Version จากเดิม Custom Runtime .NET Core 2.2 มาเป็น Custom Runtime .NET Core 3.0.100</li><li>ชุดโค้ด .NET Core Native ที่ใช้ไลบรารี่ <a rel="noreferrer noopener" href="https://github.com/zaccharles/lambda-native" target="_blank">LambdaNative</a> อย่างเดียว แต่เปลี่ยน Version จากเดิม Custom Runtime .NET Core 2.2 มาเป็น Custom Runtime .NET Core 3.0.100 โดยจะ Publish เป็น ReadyToRun  Image</li></ol>



<p>Database ผมใช้ MySQL 5.5 ที่อยู่บน AWS RDS วงเดียวกันกับ AWS Lambda ที่ผมทดสอบ และจำนวนข้อมูลมีเพียง 3 Rows</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1608" height="1052" src="https://myifew.com/wp-content/uploads/2019/10/lambda-test-data-3rows.png" alt="" class="wp-image-5570"/></figure>



<h2 class="wp-block-heading">ผลการทดสอบ (Benchmark Results)</h2>



<h4 class="wp-block-heading">Scenario 1 &#8211; Normal Compile with Custom Runtime .NET Core 2.2 กับ .NET Core 3.0.100 โดยใช้ ADO ในการเชื่อมต่อกับ MySQL</h4>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1070" height="346" src="https://myifew.com/wp-content/uploads/2019/10/benchmark-crt-ado-netcore22-vs-netcore3.png" alt="" class="wp-image-5571"/></figure>



<p>จะสังเกตว่า .NET Core 3.0 ภาพรวมแล้ว เวลาของ Cold Start จะไวกว่า 2.2 เมื่อใช้ Memory 256Mb และ 512Mb  แต่เมื่อเรียกใช้งานซ้ำๆ .NET Core 3.0 ทำงานได้ไวกว่าทุกกรณี</p>



<p>คราวนี้ลองมาดูเทียบ .NET Core 3.0.100 ด้วยกัน แบบที่ใช้ ReadyToRun กับแบบไม่ใช้</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1106" height="346" src="https://myifew.com/wp-content/uploads/2019/10/benchmark-crt-ado-netcore3-vs-netcore3-readytorun.png" alt="" class="wp-image-5572"/></figure>



<p>ผลคือ เมื่อทำเป็น ReadyToRun จะมีความเร็วของ Cold Start มากกว่าเดิม 50% แบบชนะขาดลอย  ส่วนการเรียกใช้งานแบบซ้ำๆ ตรงนี้ เลขที่ผมได้ ยังเหวี่ยงๆ แต่โดยรวมถือว่าดีกว่า</p>



<p>มาลองเทียบ .NET Core 3.0.100 แบบที่ใช้ ReadyToRun แต่ใช้ Library Connect MySQL ต่างๆ</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1686" height="346" src="https://myifew.com/wp-content/uploads/2019/10/benchmark-crt-ado-dapper-efcore-netcore3-readytorun.png" alt="" class="wp-image-5573"/></figure>



<p>ผลตามคาด คล้ายกับบล็อกเดิมที่ผมเคยทดสอบ คือ ADO เร็วที่สุด รองมาเป็น Dapper และช้าสุดคือ EFCore แต่ทั้งนี้ ผมจะทดสอบใหม่อีกครั้งเมื่อ EFCore 3.0 รองรับการใช้งาน MySQL (ซึ่งตอนที่ผมเขียนบล็อกนี้ รองรับ MySQL แค่ EFCore 2.2 อยู่นะครับ)</p>



<p>และให้สังเกต ว่าตรง memory 128 ผมมีคำว่า (max) อยู่ หมายถึงว่า .NET Core 3.0 กิน memory มากขึ้นจน Lambda ใช้เกิน Memory 128Mb</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="924" height="77" src="https://myifew.com/wp-content/uploads/2019/10/lambda-memory-peak.png" alt="" class="wp-image-5574"/><figcaption>ขึ้นแสดงแบบนี้ หมายถึงใช้ Memory มากกว่าที่จัดสรรให้ ตรงนี้ผมไม่แน่ใจว่ากระทบเงินอย่างไร แต่ที่เห้นชัดคือ ส่งผลทำให้ process ช้าลงพอสมควร น่าจะเกิดจากการต้องใช้และรอคืน memory ออกมาทำงาน จนกว่าจะเสร็จ process ทั้งหมด</figcaption></figure>



<h4 class="wp-block-heading">Scenario 2 &#8211; .NET Core 3.0.100 with LambdaNative and Microsoft.DotNet.ILCompiler โดยใช้ ADO ในการเชื่อมต่อกับ MySQL</h4>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1050" height="378" src="https://myifew.com/wp-content/uploads/2019/10/benchmark-lambdanative-ado-netcore22-vs-netcore3.png" alt="" class="wp-image-5577"/></figure>



<p>ที่ผมเคยเขียนถึง .NET Core 2.2 และ LambdaNative ไว้ใน <a rel="noreferrer noopener" href="https://myifew.com/5386/9-ways-to-fighting-with-cold-start-in-serverless/" target="_blank">9 วิธีจัดการกับ Cold Start ใน Serverless ให้ทำงานได้ไวที่สุด พร้อมตัวอย่าง</a> เป็นวิธีการที่แก้ปัญหา Cold Start ได้ดีที่สุด แต่เมื่อทดสอบกับ .NET Core 3.0 ด้วยแล้วปรากฎว่า ผมลัพธ์ดีขึ้นกว่าแต่เดิม และความเร็วเสถียรพอกันทุกครั้งที่มีการเรียกซ้ำๆ เป็นที่น่าพอใจมาก</p>



<h4 class="wp-block-heading">Scenario 3 &#8211; .NET Core 3.0.100 with LambdaNative and ReadyToRun โดยใช้ ADO ในการเชื่อมต่อกับ MySQL</h4>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1566" height="382" src="https://myifew.com/wp-content/uploads/2019/10/benchmark-lambdanative-ado-netcore3-readytorun.png" alt="" class="wp-image-5579"/></figure>



<p>ลองใช้ LambdaNative ร่วมกับ ReadyToRun ปรากฎว่าทำงานได้ช้ากว่า ใช้ไลบรารี่ Microsoft.DotNet.ILCompiler เสียอีก</p>



<p>การทำงานของ ReadyToRun จะมีการ Extract Bundle Files (ดูข้อมูลเพิ่มเติมได้ที่ <a rel="noreferrer noopener" aria-label="Bundler (opens in a new tab)" href="https://github.com/dotnet/designs/blob/master/accepted/single-file/extract.md" target="_blank">bundler</a>) ก่อนทำการ Execution ผมจึงลองทดสอบแบบทำเป็น Single File ที่เอา Bundle รวมกับโค้ด  (<strong>PublishSingleFile</strong> เป็น true) และแบบ Multiple File ที่เอา Bundle แยกกับโค้ด  (<strong>PublishSingleFile</strong> เป็น false) มาเทียบกัน ปรากฎว่า แบบ Single File ทำงานได้เร็วกว่า (น่าจะมาจาก ahead-of-time ใน .NET Core 3.0 นี้)</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1986" height="380" src="https://myifew.com/wp-content/uploads/2019/10/benchmark-lambdanative-ado-netcore22-vs-netcore3-readytorun.png" alt="" class="wp-image-5578"/></figure>



<p>ถ้าลองเทียบทั้งหมดจาก Scenario 2 และ Scenario 3 พบว่า .NET Core 3 NativeLambda ที่ทำงานกับ Microsoft.DotNet.ILCompiler จะทำงานได้ไวที่สุด</p>



<p>คราวนี้ลองถ้าลองเปลี่ยนตัว Connect MySQL มาเป็น Dapper ดูบ้าง ผลลัพธ์จะต่างกันขนาดไหน</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1988" height="876" src="https://myifew.com/wp-content/uploads/2019/10/benchmark-lambdanative-ado-dapper-netcore3-readytorun.png" alt="" class="wp-image-5580"/></figure>



<p>ในส่วนของ LambdaNative ที่ทำงานกับ <a rel="noreferrer noopener" aria-label="Microsoft.DotNet.ILCompiler ปัจจุบันยังไม่รองรับ Dapper เช่นเดิม (opens in a new tab)" href="https://github.com/dotnet/corert/issues/7386" target="_blank">Microsoft.DotNet.ILCompiler ปัจจุบันยังไม่รองรับ Dapper เช่นเดิม</a> ดังนั้นจึงมีแต่ผลทดสอบของ LambdaNative ที่ทำงานกับ ReadyToRun ซึ่งผลลัพธ์ที่ได้ Cold Start จะช้ากว่า ADO ประมาณ 0.5-2 วินาที เลยทีเดียว</p>



<h2 class="wp-block-heading">สรุป</h2>



<p>จากผลลัพธ์ทั้งหมดที่ลองทดสอบ ฟันธงได้ว่า .NET Core 3.0 ทำงานได้ไวกว่าเวอร์ชันเก่า  ในการนำมาทำ Serverless อย่าง AWS Lambda </p>



<p>แต่ด้วยความที่เป็นของใหม่ ผมเชื่อว่าคงมีอะไรปล่อยออกมาอีกเรื่อยๆ ดังนั้น ขอแนะนำชาว .NET Core ว่ามันคุ้มค่าแก่การ migrate ไปเป็น 3.0 ครับ (ข่าวว่า .NET Core 3.1 จะออกมาในช่วงพฤศจิกายนนี้)</p>



<p>บล็อกนี้ พอเห็น Release ปุ๊บรีบทดสอบและเขียนไว้ทันที ใหม่จนยังไม่มีใครเขียนถึงเลย หากผิดพลาดประการใด สามารถแนะนำ/ติชมได้นะครับ</p>



<h2 class="wp-block-heading">Demo Source Code</h2>



<ul class="wp-block-list"><li><a href="https://github.com/ifew/netcore3-readytorun-efcore">netcore3-readytorun-efcore</a> &#8211; ทดสอบ .NET Core 3 ReadyToRun กับ EFCore</li><li><a href="https://github.com/ifew/netcore3-readytorun-dapper">netcore3-readytorun-dapper</a> &#8211; ทดสอบ .NET Core 3 ReadyToRun กับ Dapper</li><li><a href="https://github.com/ifew/aws-lambda-netcore3-db">aws-lambda-netcore3-db</a> &#8211; ทดสอบทำ Lambda ด้วย .NET Core 3 กับ ADO</li><li><a href="https://github.com/ifew/aws-lambda-netcore3-efcore">aws-lambda-netcore3-efcore</a> &#8211; ทดสอบทำ Lambda ด้วย .NET Core 3 กับ EFCore</li><li><a href="https://github.com/ifew/aws-lambda-netcore3-dapper">aws-lambda-netcore3-dapper</a> &#8211; ทดสอบทำ Lambda ด้วย .NET Core 3 กับ Dapper</li><li><a href="https://github.com/ifew/aws-lambda-lambdanative-db">aws-lambda-lambdanative-db</a> &#8211; ทดสอบทำ LambdaNative ด้วย .NET Core 3 กับ ADO</li><li><a href="https://github.com/ifew/aws-lambda-netcore3-readytorun-db">aws-lambda-netcore3-readytorun-db</a> &#8211; ทดสอบทำ Lambda ด้วย .NET Core 3 ReadyToRun กับ ADO</li><li><a href="https://github.com/ifew/aws-lambda-netcore3-readytorun-efcore">aws-lambda-netcore3-readytorun-efcore</a> &#8211; ทดสอบทำ Lambda ด้วย .NET Core 3 ReadyToRun กับ EFCore</li><li><a href="https://github.com/ifew/aws-lambda-netcore3-readytorun-dapper">aws-lambda-netcore3-readytorun-dapper</a> &#8211; ทดสอบทำ Lambda ด้วย .NET Core 3 ReadyToRun กับ Dapper</li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://myifew.com/5565/benchmark-netcore-3-and-readytorun-for-aws-lambda/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>9 วิธีจัดการกับ Cold Start ใน Serverless ให้ทำงานได้ไวที่สุด พร้อมตัวอย่าง</title>
		<link>https://myifew.com/5386/9-ways-to-fighting-with-cold-start-in-serverless/</link>
					<comments>https://myifew.com/5386/9-ways-to-fighting-with-cold-start-in-serverless/#respond</comments>
		
		<dc:creator><![CDATA[iFew]]></dc:creator>
		<pubDate>Thu, 30 May 2019 12:50:32 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[AWS Lambda]]></category>
		<category><![CDATA[Cold Start]]></category>
		<category><![CDATA[Microservices]]></category>
		<category><![CDATA[Performance Test]]></category>
		<category><![CDATA[Serverless]]></category>
		<guid isPermaLink="false">https://myifew.com/?p=5386</guid>

					<description><![CDATA[Update 6 Nov 2019 &#8211; ทาง AWS ได้แก้ไขปัญหาเรื่อง Cold Start เนื่องจากใช้ VPC แล้ว ซึ่งมีผลกับ Region ดังนี้ US West&#8230;]]></description>
										<content:encoded><![CDATA[
<p><strong>Update 6 Nov 2019</strong> &#8211; ทาง AWS ได้แก้ไขปัญหาเรื่อง Cold Start เนื่องจากใช้ VPC แล้ว ซึ่งมีผลกับ Region ดังนี้ US West (N. California), EU (Ireland), EU (Paris), Asia Pacific (Mumbai), Asia Pacific (Seoul), Asia Pacific (Singapore), Asia Pacific (Sydney), and South America (San Paulo)    &#8211; ที่มา <a rel="noreferrer noopener" href="https://aws.amazon.com/th/blogs/compute/announcing-improved-vpc-networking-for-aws-lambda-functions/" target="_blank">aws.amazon.com</a> </p>



<p><strong>Update 27 Sep 2019</strong> &#8211;  ทาง AWS ได้แก้ไขปัญหาเรื่อง Cold Start เนื่องจากใช้ VPC แล้ว ซึ่งมีผลกับ Region ดังนี้  US East (Ohio), EU (Frankfurt), and Asia Pacific (Tokyo)  &#8211; ที่มา <a rel="noreferrer noopener" aria-label="aws.amazon.com (opens in a new tab)" href="https://aws.amazon.com/th/blogs/compute/announcing-improved-vpc-networking-for-aws-lambda-functions/" target="_blank">aws.amazon.com</a></p>



<p style="text-align:center">&#8230;</p>



<p>ผมเชื่อว่าใครก็ตามที่ตัดสินใจทำ Serverless มักเจอปัญหาที่แก้ไม่ตกคือ เรื่อง Cold Start ซึ่งบล็อกนี้ผมขอแชร์ประสบการณ์ที่ได้แก้ปัญหาทั้งหมด 9 วิธี เผื่อจะเป็นประโยชน์กันนะครับ  (ขออ้างอิงจากผู้ให้บริการ AWS Lambda และภาษาที่ใช้พัฒนา C# .NET Core)</p>



<span id="more-5386"></span>



<h2 class="wp-block-heading">ทำความเข้าใจ Cold Start คืออะไร</h2>



<p>ขอเกริ่นถึงสั้นๆ ของการทำงาน Serverless คือ เมื่อมีการร้องขอ (Request) ไปที่  Instances (เข้าใจง่ายๆ คือ Server ตัวหนึ่ง) เพื่อให้มันทำงาน มันจะใช้เวลาช่วงหนึ่งเพื่อทำการ Initial Instances จากนั้นค่อยเรียกโค้ดที่เราเขียน ขึ้นมาทำงานตามคำสั่ง </p>



<p>เมื่อมีการเรียกซ้ำอีก มันก็จะทำต่อเนื่องได้ทันที ไม่ต้องเสียเวลา Initial Instances ใหม่ แต่เมื่อทำงานเสร็จและปล่อยไว้สักระยะหนึ่ง เจ้า Instances ตัวนั้นก็จะเข้าสู่โหมด Idle อีก (หรือบางคนเรียกว่า หลับ, sleep) ดังนั้นเมื่อมีการร้องขอ (Request) ใช้งานอีกครั้ง จะเกิดกระบวนการ Initial Instances แบบเดิม ก่อนที่จะทำงานโค้ดของเรา</p>



<p>การ Initial Server ในครั้งแรก หรือครั้งหลังจากโหมด Idle นี่เอง เราจะเรียกว่า Cold Start</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1200" height="578" src="https://myifew.com/wp-content/uploads/2019/02/01_cold_start_aws_client-1200x578.jpeg" alt="" class="wp-image-5286" srcset="https://myifew.com/wp-content/uploads/2019/02/01_cold_start_aws_client-1200x578.jpeg 1200w, https://myifew.com/wp-content/uploads/2019/02/01_cold_start_aws_client-1024x493.jpeg 1024w, https://myifew.com/wp-content/uploads/2019/02/01_cold_start_aws_client-768x370.jpeg 768w, https://myifew.com/wp-content/uploads/2019/02/01_cold_start_aws_client-700x337.jpeg 700w, https://myifew.com/wp-content/uploads/2019/02/01_cold_start_aws_client-600x289.jpeg 600w, https://myifew.com/wp-content/uploads/2019/02/01_cold_start_aws_client.jpeg 1266w" sizes="auto, (max-width: 1200px) 100vw, 1200px" /><figcaption>Initial Instances หรือ Cold Start คือช่วงตั้งแต่ Download the code, Container Setup, Initialization and start of the code</figcaption></figure>



<p>และมากกว่านั้น ภาษาที่ต้องมีการ Compile จะมีขั้นตอน 1-3 นานกว่าภาษา Script หลายเท่า (ผมลองพ่น Hello World โดยใช้ Node ไม่ถึง 1 วินาที, เทียบกับ .Net Core ใช้เวลา 4-5 วินาที)</p>



<p>และมีคำถามบ่อยๆ ว่าจะเข้าสู่โหมด Idle ภายในกี่นาที คำตอบคือ ไม่มีใครสามารถตอบได้ชัดเจน บางแหล่งก็บอก 30-45 นาที บางแหล่งก็บอก 15 นาที แต่สำหรับผมที่เล่นเอง จะเจอแถวๆ 5 นาทีเป็นต้นไป เรียกได้ว่าลุกไปเข้าห้องน้ำแป๊บนึง พอกลับมา มันก็ช้าอีกแล้ว (ผมใช้ AWS Lambda ที่ ap-southeast-1)  </p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1624" height="860" src="https://myifew.com/wp-content/uploads/2019/05/estimate-time-to-sleep.png" alt="" class="wp-image-5407"/><figcaption>ความเป็นไปได้ที่จะเกิด Cold Start หลังมีการเรียกใช้ไปแล้ว x นาที (รูปอ้างอิงจาก <a rel="noreferrer noopener" href="https://mikhail.io/serverless/coldstarts/aws/" target="_blank">mikhail.io</a>)</figcaption></figure>



<p>อ่านพื้นฐานเรื่อง Serverless และ AWS Lambda ฉบับเต็มได้ที่ </p>



<ul class="wp-block-list"><li><a href="https://myifew.com/5166/understand-serverless-with-aws-lambda-for-newbie/">มาทำความรู้จักกับ Serverless และ AWS Lambda ฉบับคนคิดจะใช้</a></li></ul>



<h2 class="wp-block-heading">9 วิธีเพื่อใช้ลดเวลา Cold Start</h2>



<p>คราวนี้ Cold Start ได้เป็นเสี้ยนหนามของผมมาก สุดท้ายแล้ว ผมพบว่ามี 9 วิธี ที่จะลดเวลา Cold Start ได้ ผู้อ่านสามารถเลือกไปทำ หรือจะทำทั้งหมดเลยก็ได้ ลองดูกันว่ามีวิธีใดบ้าง</p>



<ol class="wp-block-list"><li>เพิ่ม Memory Allocated</li><li>Lean and Clean Code</li><li>ลด และ/หรือ เลือกใช้ Dependency ที่จำเป็นและเหมาะสม</li><li>Warm ตัว Server ของเราตลอดเวลา</li><li>Warm ตัว Server ของเราตามเวลาที่เหมาะสม</li><li>ใช้ Custom Runtimes และเลือกใช้ Runtimes ที่ทำงานได้เร็ว</li><li>ใช้ Custom Runtimes และทำเป็น Native App</li><li>หลีกเลี่ยงการใช้ VPC ถ้าไม่จำเป็น</li><li>เลือกภาษาเพื่อใช้ทำ Serverless ที่เหมาะสม</li></ol>



<h2 class="wp-block-heading">1. เพิ่ม Memory Allocated</h2>



<p>วิธีง่ายที่สุดคือใช้เงินจอง Memory ให้กับ AWS Lambda Instances มากๆ (Memory Allocated) ซึ่งมันก็เห็นผลได้เร็วและชัดเจนซะด้วย </p>



<p>กรณีแบบนี้ผมคิดว่าเหมาะกับการคำนวณ (Compute) ที่ไม่ได้เกิดขึ้นบ่อย แต่ต้องทำงานได้ไว และไม่ต้องการแก้ไขให้ยุ่งยาก &#8212; หรือพูดสั้นๆ คือ ยอมจ่ายค่า Memory ที่แพงขึ้น แลกกับ Duration Time ที่ลดลง แต่นานๆที เรียกใช้</p>



<p>กรณีนี้ผมทดลองด้วย C# .NET Core 2.1 ดึงข้อมูลจาก MySQL จำนวน 3 รายการ</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2542" height="1214" src="https://myifew.com/wp-content/uploads/2019/05/memory-allocated-memberlist-128.png" alt="" class="wp-image-5387"/><figcaption>Memory Allocated 128 MB &#8211; Duration Time 10,169 ms</figcaption></figure>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1473" height="234" src="https://myifew.com/wp-content/uploads/2019/05/memory-allocated-memberlist-256.png" alt="" class="wp-image-5388"/><figcaption>Memory Allocated 256 MB &#8211; Duration Time 4999 ms</figcaption></figure>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1457" height="237" src="https://myifew.com/wp-content/uploads/2019/05/memory-allocated-memberlist-512.png" alt="" class="wp-image-5389"/><figcaption>Memory Allocated 512 MB &#8211; Duration Time 2,426 ms</figcaption></figure>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1450" height="233" src="https://myifew.com/wp-content/uploads/2019/05/memory-allocated-memberlist-1024.png" alt="" class="wp-image-5390"/><figcaption>Memory Allocated 1,024 MB &#8211; Duration Time 1,153 ms</figcaption></figure>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1834" height="758" src="https://myifew.com/wp-content/uploads/2019/05/memory-allocated-compare.png" alt="" class="wp-image-5391"/><figcaption>เทียบโค้ดชุดเดียวกัน แต่ใช้ Memory Allocate ต่างกันกัน</figcaption></figure>



<p>สังเกตได้ว่า ยิ่งเพิ่ม Memory Allocated มากเท่าไร ก็ยิ่งลดเวลา Cold Start ได้มากเป็นเท่าตัว</p>



<p>แต่วิธีการนี้อาจจะไม่ดี 100% กับทุกกรณี เช่น ทดสอบแสดงข้อความ &#8220;Hello World&#8221; ด้วยภาษา Javascript  ตามรูปด้านล่าง</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1347" height="643" src="https://myifew.com/wp-content/uploads/2019/05/aws-coldstart-js-by-memory.png" alt="" class="wp-image-5411"/><figcaption>Javascript แสดงข้อความ Hello Wold ที่จัดสรร Memory ต่างกัน แต่ผลออกมาแทบไม่ต่างกัน <br>(รูปอ้างอิงจาก <a href="https://mikhail.io/2018/08/serverless-cold-start-war/">mikhail.io</a>)</figcaption></figure>



<p>สังเกตว่า แม้เพิ่ม Memory Allocated ไปมากเท่าใด เวลาของ Cold Start ก็ไม่ต่างกันมากนัก และ Memory สูงที่สุด ก็ไม่ได้บ่งบอกว่าจะเร็วที่สุดด้วย ดังนั้นเราจึงควรหาวิธีอื่นเพื่อลด Cold Start แทน</p>



<p>ถ้าให้ผมแนะนำ กรณีเพิ่ม Memory Allocated นี้ เราไม่ควรจะคาดเดา ซึ่งผมเคยเขียนวิธีการทดสอบไว้แล้ว สามารถอ่านวิธีการได้ที่ <a rel="noreferrer noopener" aria-label="จัดสรรทรัพยากร AWS Lambda อย่างไร ให้ราคาถูกและเร็วที่สุด (opens in a new tab)" href="https://myifew.com/5339/how-to-optimize-memory-on-aws-lambda-for-costs-and-fastest/" target="_blank">จัดสรรทรัพยากร AWS Lambda อย่างไร ให้ราคาถูกและเร็วที่สุด</a></p>



<h2 class="wp-block-heading" id="mce_24">2. Lean and Clean Code</h2>



<p>วิธีการนี้อาศัยทักษะทางเขียนโปรแกรมหน่อย คือการทำให้ Application เรากระชับที่สุด อะไรไม่ใช้ก็ตัดทิ้ง อะไรที่จำเป็นน้อย ทำให้ไม่จำเป็นเลยได้หรือไม่ อะไรเปลี่ยนวิธีได้ก็เปลี่ยน เช่น</p>



<p>การเรียกใช้ Config จาก JSON File วิธีนี้จะทำให้เราต้องเรียกใช้ Package Dependency จัดการไฟล์ JSON ต่างๆ ซึ่งเราสามารถย้ายไปใช้ Environment Variable แทนได้  ซึ่งถูกต้องตามหลัก <a href="https://myifew.com/5080/the-twelve-factors/">The Twelve Factors</a> ด้วย</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1894" height="408" src="https://myifew.com/wp-content/uploads/2019/05/lean-clean-config-in-environment-1.png" alt="" class="wp-image-5393"/><figcaption>Environment Variable ใน AWS Lambda</figcaption></figure>



<p>หรือการเรียกใช้ Package Dependency เกินความจำเป็น หรือไม่ได้ใช้แล้ว แต่ลืมลบ กรณีนี้เครื่องมือดีๆ สามารถช่วยเราได้ เช่น Visual Studio ที่จะทำการแจ้งเตือนให้เราลบตัวไม่ใช้ออก</p>



<p>ทั้งนี้ รวมไปถึงพวก Class, Function ต่างๆ ที่เขียนไว้ แต่ไม่ได้ใช้ ก็ต้องลบออกด้วย</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1184" height="332" src="https://myifew.com/wp-content/uploads/2019/05/lean-clean-delete-not-using-used.png" alt="" class="wp-image-5420"/><figcaption>Package อะไรไม่ใช้ ก็ลบออกไป</figcaption></figure>



<p>ยิ่งเราทำให้ขนาดโค้ดเราเล็กลงได้เท่าไร ก็ทำให้ไฟล์ที่แพ็คขึ้นสู่ AWS Lambda (Deployment Package File) เล็กลงตามเท่านั้น มันจะส่งผลเรื่อง Cold Start ที่ลดเวลาลงไปด้วย </p>



<p>ลองดูได้จากสถติของเว็บ <a rel="noreferrer noopener" href="https://mikhail.io/serverless/coldstarts/aws/" target="_blank">mikhail.io</a> ที่เขาใช้ Javascript ในการแสดงคำว่า &#8220;Hello World&#8221; แต่ทดลองเพิ่ม NPM packages เข้าไปใน Deployment Package File ด้วย </p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1624" height="860" src="https://myifew.com/wp-content/uploads/2019/05/compare-cold-start-deployment-size.png" alt="" class="wp-image-5409"/><figcaption>เทียบเวลาการเกิด Cold Start เมื่อ Deployment Package (แบบ zip แล้ว) มีขนาดไฟล์ที่ใหญ่ขึ้น (รูปอ้างอิงจาก <a rel="noreferrer noopener" href="https://mikhail.io/serverless/coldstarts/aws/" target="_blank">mikhail.io</a> ) <br></figcaption></figure>



<p>ผลกระทบต่อมา ถ้าเราทำให้ Deployment Package File ใหญ่ขึ้น หมายถึงการทำให้ AWS Lambda Instances ใหญ่ขึ้นตามด้วย ถ้ามาถึงขั้นนี้แล้ว แม้จะเพิ่ม Memory เข้าไปช่วยเท่าไร ก็ไม่เห็นผลนะครับ เพราะ Cold Start ยังนานเหมือนเดิม แถมเสียเงินค่า Memory เพิ่มขึ้นด้วย</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1622" height="862" src="https://myifew.com/wp-content/uploads/2019/05/compare-cold-start-instance-size.png" alt="" class="wp-image-5410"/><figcaption>เมื่อ Instances Lambda เราใหญ่ การเพิ่ม Memory เข้าไป ดูจะไม่ข่วยทำให้เวลาในการ Cold Start ลดขึ้น แถมเสียเงินไปโดยเปล่าประโยชน์  (รูปอ้างอิงจาก <a rel="noreferrer noopener" href="https://mikhail.io/serverless/coldstarts/aws/" target="_blank">mikhail.io</a> ) </figcaption></figure>



<h2 class="wp-block-heading">3. ลด และ/หรือ เลือกใช้ Dependency ที่จำเป็นและเหมาะสม</h2>



<p>ข้อนี้จำเป็นต้อง Debug ให้เห็นรายละเอียดก่อน เพื่อประเมินว่าอะไรคือจุดที่ทำให้โค้ดเราทำงานช้า หรืออาจจะไปดูจาก Benchmark ที่มีผู้ทดสอบเปรียบเทียบ Package ต่างๆ เพื่อที่เราจะได้เลือกใช้ได้เหมาะสมตั้งแต่เริ่มพัฒนางาน</p>



<p>ปกติผมเขียน .NET Core ผมจะใช้ Entity Framework (EF) Core หรือ EF Core เพราะมันเหมือนชุดมาตรฐานที่ทำงานได้เข้ากันดี และมีเครื่องมือค่อนข้างครบ แต่ปรากฎว่า EF Core นี่เอง ทำให้ใช้เวลา Cold Start มากกว่าเดิมอย่างแสนสาหัส!! </p>



<p>ผมฝืนใช้มันอยู่นาน และไปหาทางแก้วิธีอื่นแทน จนกลับมาเอะใจตอนที่ Compile ว่า EF Core มันตัวใหญ่นี่หว่า ผมเลยลองเปลี่ยนไปใช้ ADO.NET หรือ Micro ORM อย่าง Dapper แทน ซึ่งผลปรากฎว่า เร็วขึ้นอีก 100% เลยทีเดียว </p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2028" height="756" src="https://myifew.com/wp-content/uploads/2019/05/change-dependency-compare-128mb.png" alt="" class="wp-image-5401"/><figcaption>ผลเปรียบเทียบในการใช้ ADO.NET, Dapper, EF Core เพื่อเรียกข้อมูลจาก Database</figcaption></figure>



<p>เรื่องนี้คงไม่ขอเขียนเยอะ กราฟมันบอกชัดเจนอยู่แล้ว หากใครสนใจลองเอาไปเปรียบเทียบ สามารถดาวน์โหลดโค้ดของผมได้จากที่นี่ (ต้องใช้ .NET Core 3.0, MySQL)</p>



<ul class="wp-block-list"><li>ADO.NET &#8211; <a href="https://github.com/ifew/aws-lambda-db">https://github.com/ifew/aws-lambda-db</a></li><li>Dapper &#8211; <a href="https://github.com/ifew/aws-lambda-dapper">https://github.com/ifew/aws-lambda-dapper</a></li><li>Entity Framework (EF) Core &#8211; <a href="https://github.com/ifew/aws-lambda-efcore">https://github.com/ifew/aws-lambda-efcore</a></li></ul>



<p>กรณี Benchmark เทียบ Database Framework ดูเพิ่มเติมได้ที่</p>



<ul class="wp-block-list"><li><a rel="noreferrer noopener" aria-label="Dapper vs Entity Framework vs ADO.NET Performance Benchmarking (opens in a new tab)" href="https://exceptionnotfound.net/dapper-vs-entity-framework-vs-ado-net-performance-benchmarking/" target="_blank">Dapper vs Entity Framework vs ADO.NET Performance Benchmarking</a></li><li><a rel="noreferrer noopener" aria-label="Fetch performance of various .NET ORM / Data-access frameworks (opens in a new tab)" href="https://weblogs.asp.net/fbouma/fetch-performance-of-various-net-orm-data-access-frameworks" target="_blank">Fetch performance of various .NET ORM / Data-access frameworks</a></li><li><a href="https://koukia.ca/entity-framework-core-2-0-vs-dapper-net-performance-benchmark-querying-sql-azure-tables-7696e8e3ed28" target="_blank" rel="noreferrer noopener" aria-label="Entity Framework Core 2.0 vs. Dapper performance benchmark, querying SQL Azure tables (opens in a new tab)">Entity Framework Core 2.0 vs. Dapper performance benchmark, querying SQL Azure tables</a></li></ul>



<h2 class="wp-block-heading">4. Warm ตัว Server ของเราตลอดเวลา</h2>



<p>หากเรามีความจำเป็นต้องใช้ Lambda อยู่บ่อยๆ มีผู้เข้าใช้กระจัดกระจายแบบกำหนดเวลาไม่ได้ รู้แต่เข้าเมื่อไร ต้องเร็ว เช่น การแสดงรายการสินค้าของหน้าเว็บไซต์ E-Commerce เป็นต้น ถ้าสุดท้ายแล้วเราไม่สามารถแก้ไขโค้ดได้อีก หรือไม่อยากเพิ่ม Memory อีก เราก็ต้องทำให้ Server ของเราตื่นอยู่เสมอนั่นเอง</p>



<p>วิธีการคือ การตั้งเวลาให้มี Cronjob ไปเรียก (Ping) Server ของเราอยู่เรื่อยๆ อย่างเช่น AWS Lambda ที่ผมเจอ จะ Idle ทุกๆ 5 นาทีไปแล้ว ผมก็ต้องหา Cronjob ไปทำการ Invoke Lambda ประมาณนาทีที่ 5 เสมอ </p>



<p>วิธีการแบบนี้จะเปลือง Request มาก เพราะแปลว่า 1 วัน ผมจะต้องปลุกมัน 288 ครั้ง ถ้าครั้งหนึ่งต้องใช้เวลาประมวลผล (Duration Time) 2 วินาที และจอง Memory 512MB คิดดูว่าเดือนหนึ่งผมจะต้องเสียเงินไปเท่าไร</p>



<p>ซึ่งหากใครสนใจลองทำ วิธีนี้ค้นเจอได้ตามเว็บทั่วไป ส่วนมากจะใช้ CloudWatch ในการทำ ซึ่งผมไม่รู้ว่าทำไมถึงแนะนำให้ทำกันแบบนี้ แต่มันก็ไม่ผิดนะ ถ้าเหมาะสมกับรูปแบบงาน คือ ถ้าตัว Server เราถูกเรียกบ่อยทั้งวัน กอปรกับใช้เวลาประมวลผลไม่มาก ใช้ Memory ไม่สูง ก็อาจจะเหมาะสม</p>



<p>สามารถดูเพิ่มเติมได้ที่</p>



<ul class="wp-block-list"><li><a rel="noreferrer noopener" aria-label="How to Keep Your Lambda Functions Warm (opens in a new tab)" href="https://read.acloud.guru/how-to-keep-your-lambda-functions-warm-9d7e1aa6e2f0" target="_blank">How to Keep Your Lambda Functions Warm</a></li><li><a rel="noreferrer noopener" aria-label="Tutorial: Schedule AWS Lambda Functions Using CloudWatch Events (opens in a new tab)" href="https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/RunLambdaSchedule.html" target="_blank">Tutorial: Schedule AWS Lambda Functions Using CloudWatch Events</a></li><li><a rel="noreferrer noopener" aria-label="Lambda Warmer: Optimize AWS Lambda Function Cold Starts (opens in a new tab)" href="https://www.jeremydaly.com/lambda-warmer-optimize-aws-lambda-function-cold-starts/" target="_blank">Lambda Warmer: Optimize AWS Lambda Function Cold Starts</a></li><li><a href="https://github.com/jeremydaly/lambda-warmer">Lambda Warmer﻿</a></li></ul>



<h2 class="wp-block-heading">5. Warm ตัว Server ของเราตามเวลาที่เหมาะสม</h2>



<p>วิธีการนี้เหมือนกับข้อ 4 คือมี Conjob ไปเรียก (Ping) Server แต่ต่างกันที่ กำหนดเวลาในการเรียกให้ถี่มากน้อย ขึ้นกับการใช้งานจริง</p>



<p>เช่น 08:00-22:00 คนเข้าเว็บไซต์เยอะ ก็ให้เรียกทุก 5 นาที เพื่อให้ Instances ไม่เข้าโหมด Idle ส่วนเวลาตั้งแต่ 22:01-07:59 ให้เรียกทุก 10 นาที แทน เป็นต้น</p>



<p>หรือใคร Advance หน่อย ก็ทำสคริ้ปอัตโนมัติเพื่อ Edit Config Lambda ในช่วงเวลา 22:01-07:59 เพื่อปรับ  Memory ขึ้นไป แต่ไม่ต้องทำการ Ping ซึ่งมันก็จะไปใช้สูตรแบบข้อ 1. เพิ่ม Memory Allocated แทนการใช้แบบข้อ 4. เพื่อ Warm ตัว Server ตลอดเวลา</p>



<p>สามารถดูเพิ่มเติมได้ที่ </p>



<ul class="wp-block-list"><li><a rel="noreferrer noopener" aria-label="AWS CLI - Modify the version-specific settings of a Lambda function  (opens in a new tab)" href="https://docs.aws.amazon.com/cli/latest/reference/lambda/update-function-configuration.html" target="_blank">AWS CLI &#8211; Modify the version-specific settings of a Lambda function </a></li><li><a rel="noreferrer noopener" aria-label="How to trigger aws lambda at different schedule every day (opens in a new tab)" href="https://stackoverflow.com/questions/53570401/how-to-trigger-aws-lambda-at-different-schedule-every-day" target="_blank">How to trigger aws lambda at different schedule every day</a></li></ul>



<h2 class="wp-block-heading">6. ใช้ Custom Runtimes และเลือกใช้ Runtimes ที่ทำงานได้เร็ว</h2>



<p>กรณีของผู้ให้บริการอย่าง Amazon ได้เพิ่มฟีเจอร์มาให้กับ AWS Lambda คือ การ  <a rel="noreferrer noopener" aria-label="Custom Runtimes (opens in a new tab)" href="https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html" target="_blank">Custom Runtimes</a> ได้เอง โดยไม่จำเป็นต้องใช้ตัวมาตรฐานที่ให้มา</p>



<p>ตัวอย่างเช่น .NET Core Runtime ที่ทาง Amazon มีมาให้คือ version 1.0 และ 2.1 เท่านั้น</p>



<p><strong>.NET Runtimes (ดูเพิ่มเติม ได้ที่ <a rel="noreferrer noopener" aria-label="AWS Lambda Runtimes (opens in a new tab)" href="https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html" target="_blank">AWS Lambda Runtimes</a>)</strong></p>



<table class="wp-block-table"><tbody><tr><th>Name</th><th>Identifier</th><th>Languages</th><th>Operating System</th></tr><tr><td>.NET Core 2.1</td><td><code>dotnetcore2.1</code></td><td>C#PowerShell Core 6.0</td><td>Amazon Linux</td></tr><tr><td>.NET Core 1.0</td><td><code>dotnetcore1.0</code></td><td>C#</td><td>Amazon Linux</td></tr></tbody></table>



<p>แต่ปัจจุบันมี 2.2 และ 3.0 แล้ว ซึ่งถ้าเราพบว่า 3.0 ทำงานได้ดีกว่า หรือไวกว่า เราก็สามารถสร้าง Runtimes ขึ้นมาเองได้ หรืออาจจะไปสร้างเป็น <a href="https://aws.amazon.com/th/blogs/apn/aws-lambda-custom-runtime-for-php-a-practical-example/" target="_blank" rel="noreferrer noopener" aria-label="PHP Runtimes (opens in a new tab)">PHP Runtimes</a> ก็ยังได้ ถ้าเราอยากจะใช้ แต่ Amazon ไม่ได้ทำรองรับ</p>



<p>ในประเด็นนี้ ผมพยายามทดสอบหลายครั้ง ผมพบว่าใน .NET Core เมื่อทำ Custom Runtimes แล้ว ไม่ได้ช่วยทำให้ไวขึ้นแต่อย่างใด แถมช้าลงด้วย มีดีอย่างเดียวคือ ได้ใช้ฟีเจอร์ใหม่ๆ ในเวอร์ชั่นใหม่ (แต่ในภาษาอื่นๆ ถ้าใครทำดูแล้วได้ผลที่ดีขึ้น ลองมาแชร์กันได้ครับ)</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2534" height="1090" src="https://myifew.com/wp-content/uploads/2019/05/crt-netcore21.png" alt="" class="wp-image-5398"/><figcaption>.NET Core 2.1 Runtimes (ตัวมาตรฐานของ Amazon)</figcaption></figure>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2542" height="1092" src="https://myifew.com/wp-content/uploads/2019/05/crt-netcore30.png" alt="" class="wp-image-5399"/><figcaption>.NET Core 3.0 preview4 Runtimes (ตัว Custom Runtimes ที่ผมทำขึ้นมา)</figcaption></figure>



<p>สังเกตว่า ตัวมาตรฐาน .NET Core 2.1 Runtimes ทำงานได้ไวกว่าที่ผม Custom Runtimes เอง ที่เวอร์ชั่น 3.0 (แม้ว่าจริงๆแล้วผล <a href="https://devblogs.microsoft.com/dotnet/performance-improvements-in-net-core-3-0/" target="_blank" rel="noreferrer noopener" aria-label="Benchmark ของ .NET Core 3.0 (opens in a new tab)">Benchmark ของ .NET Core 3.0</a> จะทำงานได้ไวกว่า 2.1 ในสภาพแวดล้อมที่ไม่ใช่ AWS Lambda ก็ตาม)</p>



<p>ใครอยากทดสอบ Custom Runtimes ลองดูโค้ดตัวอย่างที่ผมทำไว้ได้</p>



<ul class="wp-block-list"><li>.NET Core 3.0  &#8211; <a rel="noreferrer noopener" aria-label="https://github.com/ifew/aws-lambda-crt-example (opens in a new tab)" href="https://github.com/ifew/aws-lambda-crt-example" target="_blank">https://github.com/ifew/aws-lambda-crt-example</a></li><li>.NET Core 3.0 with ADO.NET &#8211; <a rel="noreferrer noopener" aria-label="https://github.com/ifew/aws-lambda-crt-db (opens in a new tab)" href="https://github.com/ifew/aws-lambda-crt-db" target="_blank">https://github.com/ifew/aws-lambda-crt-db</a></li><li>.NET Core 3.0 with Dapper &#8211; <a rel="noreferrer noopener" aria-label="https://github.com/ifew/aws-lambda-crt-db-dapper (opens in a new tab)" href="https://github.com/ifew/aws-lambda-crt-db-dapper" target="_blank">https://github.com/ifew/aws-lambda-crt-db-dapper</a></li></ul>



<p>เรื่อง Custom Runtimes สามารถศึกษาเพิ่มเติมได้ที่นี่ครับ</p>



<ul class="wp-block-list"><li><a href="https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html">Custom AWS Lambda Runtimes</a></li><li><a href="https://medium.com/@zaccharles/benchmarking-lambdas-new-custom-runtime-for-net-core-43ea79b5a35a" target="_blank" rel="noreferrer noopener" aria-label="Benchmarking Lambda’s New Custom Runtime for .NET Core (opens in a new tab)">Benchmarking Lambda’s New Custom Runtime for .NET Core</a></li></ul>



<h2 class="wp-block-heading" id="mce_94">7. ใช้ Custom Runtimes และทำเป็น Native App</h2>



<p>แม้ว่าการทำ Custom Runtimes ผมจะไม่พอใจกับผลลัพธ์ที่เกิดขึ้น (กรณี C# .NET Core) แต่เราสามารถเอาวิธีการเดียวกันมาเรียกใช้ Binary Executable File แทนได้นะ ด้วยการทำโค้ดของเราให้เป็น Native Application ซะเลย </p>



<p>การแก้ไขปัญหาด้วยวิธีนี้ ผมภูมิใจนำเสนอมากๆๆๆ เรียกได้ว่า เป็นไม้ตาย ที่แก้ปัญหา Cold Start ได้อยู่หมัดจากทุกๆ วิธีที่ผมทำมาเลยทีเดียว แต่ก็ค่อนข้างทำยากและมีข้อจำกัดเยอะ</p>



<p>มาลองดูสถิติที่ผมทำบน C# .NET Core กัน ว่าผลแตกต่างแค่ไหน ซึ่งผมเทียบโดยใช้ Database Framework ต่างกัน 3 ตัว ที่ทำงานต่างกันบน Runtimes แบบปกติ (.NET Core 2.1), Custom Runtimes (.NET Core 3.0) และ Native (.NET Core  3.0 + CoreRT)</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2106" height="310" src="https://myifew.com/wp-content/uploads/2019/05/nativeapp-compare.png" alt="" class="wp-image-5402"/></figure>



<p>จากตาราง ตัว Lambda Native (ช่องสีเขียว) ชนะใสๆ แบบขาดรอย เพราะ Cold Start แค่ 1.3 วินาที ในขณะที่ตัวอื่นๆ ทำงานที่ 10-33 วินาที (เทียบกันที่ ADO.NET)</p>



<p>สังเกตว่าทำไมผมมี Lambda Native แค่ ADO.NET อย่างเดียว </p>



<p>เนื่องจาก Lambda Native ใช้ Runtimes ชื่อว่า CoreRT ซึ่งมันเป็น .NET Core runtime อีกตัวที่พัฒนามาเพื่อ AOT (ahead of time compilation) โดยเฉพาะ กล่าวคือ มันจะแปลงภาษาจาก High-Level Programming เช่น C#, Java ไปเป็นภาษาเครื่อง (Machine code) กันเลยทีเดียว</p>



<p>แต่ๆๆ เจ้าตัว CoreRT ยังไม่สมบูรณ์นัก และมีผู้ใช้งานไม่มาก หาข้อมูลได้ยาก จึงทำให้การพัฒนาได้ยากตาม รวมไปถึงหลายสิ่งยังไม่สามารถใช้งานได้ เช่น <a rel="noreferrer noopener" aria-label="เมื่อมีการเอา Dapper มาใช้ แต่โดนแจ้ง Error ว่า &quot;Operation is not supported on this platform&quot; (opens in a new tab)" href="https://github.com/dotnet/corert/issues/7386" target="_blank">เมื่อมีการเอา Dapper มาใช้ แต่โดนแจ้ง Error ว่า &#8220;Operation is not supported on this platform&#8221;</a> ด้วยเหตุผลนี้เอง ผมถึงบอกว่า ทำไมยังมีข้อจำกัดอยู่ และทำได้ยาก</p>



<p>ดูตัวอย่างที่ผมทำได้ที่นี่</p>



<ul class="wp-block-list"><li>Hello World &#8211; <a href="https://github.com/ifew/aws-lambda-lambdanative">https://github.com/ifew/aws-lambda-lambdanative</a></li><li>ADO.NET &#8211; <a href="https://github.com/ifew/aws-lambda-lambdanative-db">https://github.com/ifew/aws-lambda-lambdanative-db</a></li></ul>



<p>สามารถดูข้อมูลการทำ Lambda Native เพิ่มเติมได้ที่</p>



<ul class="wp-block-list"><li>LambdaNative &#8211; <a href="https://github.com/zaccharles/lambda-native">https://github.com/zaccharles/lambda-native</a></li><li>CoreRT &#8211; <a href="https://github.com/dotnet/corert">https://github.com/dotnet/corert</a></li></ul>



<h2 class="wp-block-heading">8. หลีกเลี่ยงการใช้ VPC ถ้าไม่จำเป็น</h2>



<p><strong>Update 6 Nov 2019</strong> &#8211; ทาง AWS ได้แก้ไขปัญหาเรื่อง Cold Start เนื่องจากใช้ VPC แล้ว ซึ่งมีผลกับ Region ดังนี้ US West (N. California), EU (Ireland), EU (Paris), Asia Pacific (Mumbai), Asia Pacific (Seoul), Asia Pacific (Singapore), Asia Pacific (Sydney), and South America (San Paulo)    &#8211; ที่มา <a rel="noreferrer noopener" href="https://aws.amazon.com/th/blogs/compute/announcing-improved-vpc-networking-for-aws-lambda-functions/" target="_blank">aws.amazon.com</a> </p>



<p><strong>Update 27 Sep 2019</strong> &#8211;  ทาง AWS ได้แก้ไขปัญหาเรื่อง Cold Start เนื่องจากใช้ VPC แล้ว ซึ่งมีผลกับ Region ดังนี้  US East (Ohio), EU (Frankfurt), and Asia Pacific (Tokyo)  &#8211; ที่มา <a rel="noreferrer noopener" aria-label="aws.amazon.com (opens in a new tab)" href="https://aws.amazon.com/th/blogs/compute/announcing-improved-vpc-networking-for-aws-lambda-functions/" target="_blank">aws.amazon.com</a></p>



<p style="text-align:center">&#8230;</p>



<p>คำแนะนำจาก <a rel="noreferrer noopener" aria-label="theburningmonk.com (opens in a new tab)" href="https://theburningmonk.com/2018/01/im-afraid-youre-thinking-about-aws-lambda-cold-starts-all-wrong/" target="_blank">theburningmonk.com</a> บอกว่า ควรหลีกเลี่ยง ถ้าไม่จำเป็น เพราะการใช้ VPC มันจะกำหนดให้ Lambda ต้องสร้าง ENIs ขึ้นมา (Elastic Network Interface) เพื่อใช้คุยกันภายใน VPC และในเว็บไซต์บอกว่า กระบวนการนี้มันจะทำให้เพิ่มเวลา Cold Start อีกประมาณ  10 วินาที!!</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1632" height="864" src="https://myifew.com/wp-content/uploads/2019/05/vpc-novpc-cold-start.png" alt="" class="wp-image-5406"/><figcaption>เทียบเวลาการเปิดใช้งาน AWS Lambda ตัวเดียวกัน แบบไม่มี VPC และมี VPC (รูปอ้างอิงจาก <a href="https://mikhail.io/serverless/coldstarts/aws/" target="_blank" rel="noreferrer noopener" aria-label="mikhail.io (opens in a new tab)">mikhail.io</a>)</figcaption></figure>



<p>และในเว็บไซต์ <a href="https://epsagon.com/blog/aws-lambda-programming-language-comparison/">epsagon.com</a> ได้ให้ข้อมูลเพิ่มเติมว่า การกำหนด Memory ที่มากขึ้น ใน AWS Lambda ของภาษา C# , Java มันจะทำการสร้าง ENIs เพิ่มจำนวนขึ้นด้วย แม้ว่า AWS Lambda จะมีกระบวนการที่นำ ENIs เก่ามาใช้ใหม่ได้ก็ตาม โดยสังเกตได้จากสูตรที่ชี้แจงไว้ใน AWS Document</p>



<p>ดังนั้น สรุปได้คือ ถ้าเราใช้ VPS และยิ่งเพิ่ม Memory Allocate เข้าไปในตัว AWS Lambda มันก็จะยิ่งเพิ่ม ENIs ให้เหมาะสมกัน และจะส่งผลกับ Cold Start ที่ใช้เวลามากขึ้นตามไปด้วย</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1586" height="828" src="https://myifew.com/wp-content/uploads/2019/05/memory-related-enis.png" alt="" class="wp-image-5404"/><figcaption>การเพิ่ม Memory เพื่อรองรับ Capacity ที่มากขึ้น เท่ากับ  AWS Lambda จะต้องเพิ่มจำนวนการสร้าง ENIs ตามไปด้วย (รูปอ้างอิงจาก <a href="https://docs.aws.amazon.com/lambda/latest/dg/vpc.html">https://docs.aws.amazon.com/lambda/latest/dg/vpc.html</a>)<br></figcaption></figure>



<p>ปล. มีข่าวดีแว่วๆมา อ้างอิงจาก <a href="https://twitter.com/jeremy_daly/status/1068272580556087296">@jeremy_daly</a> ที่เข้าร่วมงาน AWS re:Invent ว่า AWS มีแผนจะแก้ปัญหาเรื่องนี้ภายในปี 2019 นี่แหละครับ</p>



<h2 class="wp-block-heading">9. เลือกภาษาเพื่อใช้ทำ Serverless ที่เหมาะสม</h2>



<p>ข้อสุดท้าย ถ้าไม่ผูกติดกับภาษาในการพัฒนา Serverless แนะนำให้ใช้ตระกูล Scripting Language แทน Compiled language จะช่วยแก้ปัญหา Cold Start ได้อย่างมาก</p>



<p>ลองดูจากสถิติของเว็บไซต์ <a rel="noreferrer noopener" href="https://mikhail.io/serverless/coldstarts/aws/" target="_blank">mikhail.io</a></p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1624" height="864" src="https://myifew.com/wp-content/uploads/2019/05/cold-start-per-language.png" alt="" class="wp-image-5408"/><figcaption>เทียบเวลาการเกิด Cold Start ในแต่ละภาษา (รูปอ้างอิงจาก <a rel="noreferrer noopener" href="https://mikhail.io/serverless/coldstarts/aws/" target="_blank">mikhail.io</a>)</figcaption></figure>



<p>พวก JavaScript, Python, Go, Java, และ Ruby จะทำงานเสร็จแถวๆ 500ms หรือไม่เกิน 800ms แต่สำหรับ C# จะใช้เวลาตั้งแต่ 0.8 จนถึง 5 วินาที เลยทีเดียว</p>



<p>ตัวอย่างสถิติอีกสักแห่ง จากเว็บไซต์ <a href="https://read.acloud.guru/does-coding-language-memory-or-package-size-affect-cold-starts-of-aws-lambda-a15e26d12c76">read.acloud.guru</a></p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1796" height="1068" src="https://myifew.com/wp-content/uploads/2019/05/compare-cold-start-by-language.png" alt="" class="wp-image-5412"/><figcaption>เวลาเกิด Cold Start โดยเปรียบเทียบภาษาที่ใช้กับการจัดสรร Memory (รูปอ้างอิงจาก <a href="https://read.acloud.guru/does-coding-language-memory-or-package-size-affect-cold-starts-of-aws-lambda-a15e26d12c76">read.acloud.guru</a>)</figcaption></figure>



<p>สถิติจากเว็บไซต์นี้ ได้ผลใกล้เคียงกับที่แรกคือ พวก JavaScript, Python ยังคงทำงานได้เร็วแถวๆ 500ms ส่วน Java และ C# ใช้เวลา Cold Start นานมาก</p>



<p>และให้ข้อมูลเพิ่มเติมนิดนึงครับว่า แม้จะเปลี่ยนผู้ให้บริการ ก็ได้ผลไม่ต่างกัน ถ้าหากใครคิดว่า ใช้ C# บน Azure Function น่าจะเร็วกว่า AWS Lambda นั้น คิดผิดนะคร้าบบบ..</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="1209" height="837" src="https://myifew.com/wp-content/uploads/2019/05/coldstart-per-language-vendor.png" alt="" class="wp-image-5413"/><figcaption>เทียบเวลาการเกิด Cold Start ในแต่ละภาษา และแต่ละผู้ให้บริการ (รูปอ้างอิงจาก <a rel="noreferrer noopener" href="https://mikhail.io/serverless/coldstarts/aws/" target="_blank">mikhail.io</a>)</figcaption></figure>



<p>ให้สังเกตว่า C# บน Azure Function ทำงานได้ช้ากว่า AWS Lambda ประมาณ 500ms &#8211; 1 วินาที เลยทีเดียว</p>



<p>อ่านข้อมูลการเปรียบเทียบเพิ่มเติมได้ที่นี่</p>



<ul class="wp-block-list"><li><a rel="noreferrer noopener" aria-label="Comparing AWS Lambda performance of Node.js, Python, Java, C# and Go (opens in a new tab)" href="https://read.acloud.guru/comparing-aws-lambda-performance-of-node-js-python-java-c-and-go-29c1163c2581" target="_blank">Comparing AWS Lambda performance of Node.js, Python, Java, C# and Go</a></li><li><a href="https://read.acloud.guru/does-coding-language-memory-or-package-size-affect-cold-starts-of-aws-lambda-a15e26d12c76" target="_blank" rel="noreferrer noopener" aria-label="How does language, memory and package size affect cold starts of AWS Lambda? (opens in a new tab)">How does language, memory and package size affect cold starts of AWS Lambda?</a></li></ul>



<h2 class="wp-block-heading">สรุป</h2>



<p>ตอนนี้เราก็คงต้องต่อสู่กับ Cold Start กันต่อไป เพราะเราไม่สามารถแก้ไขอะไรมันได้มากนัก ส่วนผู้ให้บริการเองอย่าง Amazon, Azure, Google Cloud ก็รู้ปัญหานี้เช่นกัน และพยายามปรับปรุงมันให้ดีขึ้นอยู่เรื่อยๆ แต่ที่สำคัญ ก่อนที่เราจะตัดสินใจใช้ Serverless เราต้องคิดให้ดีก่อนว่าเหมาะสมกับงานของเราแล้วหรือยัง</p>



<p>&#8212;</p>



<p>ที่มาภาพหน้าปก <a href="http://www.drunktiki.com/2016/08/17/yoda-pug/yoda-pug-jpg/">http://www.drunktiki.com/2016/08/17/yoda-pug/yoda-pug-jpg/</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://myifew.com/5386/9-ways-to-fighting-with-cold-start-in-serverless/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>จัดสรรทรัพยากร AWS Lambda อย่างไร ให้ราคาถูกและเร็วที่สุด</title>
		<link>https://myifew.com/5339/how-to-optimize-memory-on-aws-lambda-for-costs-and-fastest/</link>
					<comments>https://myifew.com/5339/how-to-optimize-memory-on-aws-lambda-for-costs-and-fastest/#respond</comments>
		
		<dc:creator><![CDATA[iFew]]></dc:creator>
		<pubDate>Thu, 11 Apr 2019 12:08:16 +0000</pubDate>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[AWS]]></category>
		<category><![CDATA[AWS Lambda]]></category>
		<category><![CDATA[Microservices]]></category>
		<category><![CDATA[Performance Test]]></category>
		<category><![CDATA[Serverless]]></category>
		<category><![CDATA[Testing Tools]]></category>
		<guid isPermaLink="false">https://myifew.com/?p=5339</guid>

					<description><![CDATA[เป็นคำถามที่ทุกคนอยากรู้ ว่าจะตั้งค่า Memory ใน AWS Lambda Function อย่างไรให้ราคาถูกสุด แต่ได้ความเร็วที่สุด แบบไม่ใช้ทรัพยากรเว่อร์เกินไป]]></description>
										<content:encoded><![CDATA[
<p>มาจัดเรื่อง AWS Lambda อีกสักโพสต์ (ก่อนที่ผมจะสลับไปเขียนเรื่องท่องเที่ยวบ้าง ฮ่าๆ) ซึ่งครั้งนี้ขอเขียนถึงวิธีการเลือกใช้ทรัพยากร อย่างเช่น Memory ให้เหมาะสมที่สุด ทำงานได้เร็วด้วย และต้องคุ้มค่ากับการจ่ายเงินด้วย </p>



<span id="more-5339"></span>



<p>ใน Slide ของ <a rel="noreferrer noopener" aria-label="Become a Serverless Black Belt (opens in a new tab)" href="https://www.slideshare.net/AmazonWebServices/become-a-serverless-black-belt-optimizing-your-serverless-applications-aws-online-tech-talks" target="_blank">Become a Serverless Black Belt</a> ได้พูดถึงเรื่องการจัดสรรทรัพยากรไว้หลายหน้า และในหน้าปิดท้ายของตอน ได้บอกไว้ว่า </p>



<blockquote class="wp-block-quote is-layout-flow wp-block-quote-is-layout-flow"><p>Dont&#8217;s Guestimate</p></blockquote>



<p>หมายถึง เรื่องพวกนี้ &#8220;อย่าไปเดา&#8221; นะหนู เพราะเราไม่สามารถรู้ได้เลยว่า โค้ดที่เราเขียน ใช้ Memory เท่าไร ดังนั้นจะต้องจัดสรรให้มันเท่าไรถึงจะเพียงพอ ซึ่งถ้าจัดให้มากไป ก็เสียเงินจับจองเมมโมรี่ (Allocated Memory) โดยเปล่าประโยชน์, และถ้าจัดให้น้อยไป ก็ใช้เวลาคำนวณนานขึ้น (Computed Time) ไม่ว่าจะทางใด ก็มีผลกับค่าใช้จ่ายที่เกิดขึ้นทั้งคู่.. ความสนุก Serverless มันอยู่ตรงนี้แหละ!!</p>



<h2 class="wp-block-heading">เลิกเดา แล้วมาคุยกันด้วยข้อมูลดีกว่า</h2>



<p>ใน Slide เรื่องเดียวกัน ได้อ้างถึงเครื่องมือตัวหนึ่ง ชื่อ <a rel="noreferrer noopener" aria-label="AWS Lambda Power Tuning (opens in a new tab)" href="https://github.com/alexcasalboni/aws-lambda-power-tuning" target="_blank">AWS Lambda Power Tuning</a> ที่พัฒนาโดย Alex Casalboni และเขาได้เล่าที่มาในบล็อก <a rel="noreferrer noopener" aria-label="AWS Lambda Power Tuning with AWS Step Functions (opens in a new tab)" href="https://serverless.com/blog/aws-lambda-power-tuning/" target="_blank">AWS Lambda Power Tuning with AWS Step Functions</a> ว่า Serverless Developer ทุกคนมักหลับหูหลับตาเพื่อจัดสรรทรัพยากร หรือไม่ก็ใช้วิธีการ Manual Test เพื่อทดสอบดูทีละแบบ ซึ่งมันก็เสียเวลาและไม่ได้ผลลัพธ์ที่ดีแน่นอน</p>



<p>พี่แกเลยบอกว่า ถ้าเช่นนั้นเรามาใช้วิธี Data-Driven ดีกว่า! แกเลยเริ่มจากทำ<a rel="noreferrer noopener" aria-label="โพลสำรวจใน Twitter (opens in a new tab)" href="https://twitter.com/alex_casalboni/status/854059283465383937" target="_blank">โพลสำรวจใน Twitter</a> ว่าสิ่งที่สังเกตเห็นมันเป็นจริงไหม</p>



<figure class="wp-block-embed-twitter wp-block-embed is-type-rich is-provider-twitter"><div class="wp-block-embed__wrapper">
<blockquote class="twitter-tweet" data-width="550" data-dnt="true"><p lang="en" dir="ltr">How do you choose the optimal RAM configuration for your AWS Lambda Functions? I&#39;ll publish results &amp; my OSS project in a week! <a href="https://twitter.com/hashtag/serverless?src=hash&amp;ref_src=twsrc%5Etfw">#serverless</a></p>&mdash; Alex Casalboni (@alex_casalboni) <a href="https://twitter.com/alex_casalboni/status/854059283465383937?ref_src=twsrc%5Etfw">April 17, 2017</a></blockquote><script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
</div></figure>



<p>ซึ่งกว่า 50% ในโพล เคยใช้ Memory เท่าไรก็ตั้งไว้แบบเดิมเท่านั้น ไม่ได้สนใจที่จะ Tuning อะไร และครึ่งหนึ่งนิยมตั้งค่าไว้ที่ 128MB ทุก Function ด้วยเหตุผลที่ว่า เพราะมันราคาถูกที่สุดน่ะสิ! ไม่ได้สนใจเลยว่าจะทำงานได้ไวไหม</p>



<p>แต่ไม่ว่าจะเลือกตอบข้อไหน ก็ยังไม่ใช่สิ่งที่ควรทำในการตั้งค่า Memory ให้กับ Serverless อย่าง AWS Lambda</p>



<p>จากนั้นเขาก็เขียนเล่าถึงเหตุผลว่าทำไม Function ทำงานได้ช้า และคอนเซปของการแก้ปัญหาของ (ซึ่งถ้าใครอยากอ่านฉบับเต็ม ไปอ่านได้ที่ <a rel="noreferrer noopener" href="https://serverless.com/blog/aws-lambda-power-tuning/" target="_blank">AWS Lambda Power Tuning with AWS Step Functions) </a>จนสรุปได้ว่า การ Tuning Memory ทีละลำดับ พร้อมกับทดสอบเรียกใช้ (Invocating) ด้วยจำนวนที่ต้องการ ​กับ Lambda Function ทีละตัว คือหนทางที่เหมาะสม และต้องเป็นการทดสอบแบบ Automate ทั้งหมดด้วย เพื่อความรวดเร็ว  จึงเป็นที่มาของเครื่องมือ AWS Lambda Power Tuning ที่ผมกำลังจะเขียนถึง</p>



<h2 class="wp-block-heading">รู้จักกับ AWS Lambda Power Tuning</h2>



<p>เจ้าเครื่องมือ AWS Lambda Power Tuning นี้ ถูกพัฒนาด้วย Node.js โดยจะมี Lambda Function จำนวน 4 ตัว และเราต้องสร้าง Role กับ StepFunction เพื่อใช้มัน</p>



<p>แต่ไม่ต้องตกใจ ว่าจะยุ่งยาก เพราะโค้ดบน Github นาย Alex ได้มีไฟล์ Serverless.yml หรือเป็น AWS CloudFormation Script ไว้ให้เราใช้ Provision Infrastructure เรียบร้อย แต่เราจะต้องรันคำสั่งด้วยเครื่องมือชื่อ Serverless</p>



<p>การทำงานของมันคือ มันจะไปสร้าง Version ใน Lambda Function และกำหนด Memory ทีละช่วงที่เราต้องการ และทดสอบทีละ Version โดยจะหาค่าที่เหมาะสมที่สุดว่า ต้องใช้ Memory เท่าไร ที่สามารถ Compute ได้เร็วสุด และจ่ายเงินถูกที่สุด </p>



<p>ถ้าทำเอง น่าจะใช้เวลามากๆ เลยทีเดียว กว่าจะทดสอบ Lambda ได้ทีละตัว</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="648" height="956" src="https://myifew.com/wp-content/uploads/2019/04/lambda-power-tunning-working.png" alt="" class="wp-image-5351"/></figure>



<h2 class="wp-block-heading" id="mce_25">ตัวอย่างผลลัพธ์ของ AWS Lambda Power Tuning</h2>



<p>เช่น ผมมี Lambda Function เพื่อแสดงรายการสินค้า 1 ตัว ผมต้องการรู้ว่า Memory ในช่วง 128 MB &#8211; 1024 MB จำนวนเท่าไรจะเหมาะสมที่สุด..</p>



<p>ตัว AWS Lambda Power Tuning ก็จะเรียก Function ของมันมาเรียงเป็น Step ทำงานให้เราดูเป็นกราฟ</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2142" height="1234" src="https://myifew.com/wp-content/uploads/2019/04/example-lambda-power-tunning.png" alt="" class="wp-image-5349"/></figure>



<p>เมื่อทำการทดสอบเสร็จ จะสรุปที่ Output ด้านขวามือ เพื่อบอกว่า ควรใช้ Power (Memory) เท่าไร ถึงจะคุ้มค่าที่สุด ด้วย Cost และ Duration Time เท่าไร</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2642" height="1250" src="https://myifew.com/wp-content/uploads/2019/04/example-lambda-power-tunning-monitoring-execution-1.png" alt="" class="wp-image-5361"/></figure>



<p>ถ้าใครอยากเห็นรายละเอียดการทดสอบแต่ละ Memory ให้เลื่อนลงมาดูด้านล่าง จะมี Output บอกอีกส่วนหนึ่งแบบละเอียด</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="914" height="1158" src="https://myifew.com/wp-content/uploads/2019/04/example-lambda-power-tunning-logs-detail.png" alt="" class="wp-image-5369"/></figure>



<p>คราวนี้ ทดสอบครั้งแรก ผมไม่ค่อยเชื่อผลเท่าไร จึงลองทดสอบทั้งหมด 4 รอบ, แต่ละรอบและแต่ละ Memory ผมจำลองให้มีการร้องขอ (Invocation) จำนวน 10 ครั้ง จำนวน 3 รอบ และ 100 ครั้ง จำนวน 1 รอบ ผลที่ได้ออกมา คือ</p>



<p><strong>Execution #1 &#8211; Invocation 10</strong></p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="898" height="404" src="https://myifew.com/wp-content/uploads/2019/04/example-compare-lambda-power-tunning-list1.png" alt="" class="wp-image-5346"/></figure>



<p><strong>Execution #2 &#8211; Invocation 10</strong></p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="862" height="408" src="https://myifew.com/wp-content/uploads/2019/04/example-compare-lambda-power-tunning-list3.png" alt="" class="wp-image-5348"/></figure>



<p><strong>Execution #3 &#8211; Invocation 10</strong></p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="860" height="408" src="https://myifew.com/wp-content/uploads/2019/04/example-compare-lambda-power-tunning-list2.png" alt="" class="wp-image-5347"/></figure>



<p><strong>Execution #4 &#8211; Invocation 100</strong></p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="902" height="406" src="https://myifew.com/wp-content/uploads/2019/04/example-compare-lambda-power-tunning-list4.png" alt="" class="wp-image-5350"/></figure>



<p>จากผลการทดสอบ แปลว่า Function แสดงรายการสินค้า ถ้าใช้ Memory ที่ 320 MB จะเร็วและถูกที่สุด โดยเราไม่จำเป็นต้องใช้ Memory ถึง 1024 MB ก็ได้ เพราะผลที่ได้อาจจะไม่ต่างกันมาก ไม่ว่าจะมีการเรียกใช้ 10 ครั้งหรือ 100 ครั้ง ต่อเนื่องก็ตาม </p>



<p>(อย่าลืมว่า ค่าใช้จ่ายการ Compute จะปัดเศษขึ้น เป็นหน่วย 100ms นะครับ ไม่ว่าจะ 40.2ms , 80.8ms ก็ถูกปัดไปคิดเงินเป็น 100ms เท่ากัน)</p>



<p>ปล. จุดสังเกต คือ Memory 256 MB จะทำงานได้ช้ากว่า และแพงกว่า ทั้ง 4 รอบเลย ตรงนี้ผมต้องไปตรวจสอบในระดับ Source Code, Logs, หรือใช้ AWS X-Ray ดูต่อว่าทำไม</p>



<h2 class="wp-block-heading" id="mce_57">วิธีการติดตั้ง AWS Lambda Power Tuning ผ่าน Serverless</h2>



<p class="has-background has-very-light-gray-background-color">** หากใครไม่สะดวกติดตั้งผ่าน Serverless สามารถทำด้วยการ Clone git แล้วรันสคริ้ป ซึ่งสามารถดูได้ที่ <a href="https://github.com/alexcasalboni/aws-lambda-power-tuning">https://github.com/alexcasalboni/aws-lambda-power-tuning</a> **</p>



<p>ขายของมานาน มาดูวิธีติดตั้งและใช้งานกัน ซึ่งในที่นี้ผมยกตัวอย่างของ MacOS, Linux  ส่วนชาว Windows ให้ใช้ PowerShell ดูนะครับ</p>



<h4 class="wp-block-heading">ความต้องการก่อนติดตั้งใช้งาน</h4>



<ol class="wp-block-list"><li>AWS Account จะต้องมีสิทธิ์ใช้งาน ดังนี้<ul><li>cloudformation:*</li><li>states:*</li><li>lambda:*</li><li>iam:CreateRole</li></ul></li><li>เครื่องที่ติดตั้งจะต้องมี npm (<a rel="noreferrer noopener" aria-label="วิธีติดตั้ง (opens in a new tab)" href="https://docs.npmjs.com/downloading-and-installing-node-js-and-npm" target="_blank">วิธีติดตั้ง npm</a>)</li></ol>



<h4 class="wp-block-heading">ติดตั้ง Serverless Framework และใส่ AWS credentials</h4>



<pre class="wp-block-code"><code>$ npm install serverless -g
$ serverless config credentials --provider aws --key XXX --secret YYY</code></pre>



<h4 class="wp-block-heading">ติดตั้ง AWS Lambda Power Tuning</h4>



<pre class="wp-block-code"><code>$ serverless install -u https://github.com/alexcasalboni/aws-lambda-power-tuning</code></pre>



<h4 class="wp-block-heading">ทำการติดตั้ง Package Dependency</h4>



<pre class="wp-block-code"><code>$ cd aws-lambda-power-tuning
$ npm install</code></pre>



<h4 class="wp-block-heading">สร้าง Config ของ State Machine ในไฟล์ serverless.yml</h4>



<pre class="wp-block-code"><code>$ npm run generate -- -A ACCOUNT_ID [-R eu-west-1] [-P 128,256,512,1024]

เช่น

$ npm run generate -- -A 182000046000 -R ap-southeast-1 -P 128,192,256,320,448,512,704,1024</code></pre>



<h4 class="wp-block-heading">ทำการ Deploy AWS Lambda Power Tuning</h4>



<pre class="wp-block-code"><code>$ serverless deploy</code></pre>



<h2 class="wp-block-heading" id="mce_66">วิธีการใช้งาน AWS Lambda Power Tuning</h2>



<p>เมื่อติดตั้งเสร็จแล้ว ลองเช็คที่ AWS Lambda Function เรา จะเจอฟังก์ชั่นเพิ่มขึ้นมา ดังนี้</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2582" height="340" src="https://myifew.com/wp-content/uploads/2019/04/lambda-power-tunning-lambda-function.png" alt="" class="wp-image-5354"/></figure>



<p>จากนั้นให้ไปดูที่เซอร์วิส <a rel="noreferrer noopener" aria-label="Step Function (opens in a new tab)" href="https://console.aws.amazon.com/states/home" target="_blank">Step Function</a> จะพบ State Machine</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2790" height="714" src="https://myifew.com/wp-content/uploads/2019/04/lambda-power-tuning-state-machine.png" alt="" class="wp-image-5355"/></figure>



<p>ให้กดที่ Start Excution</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2130" height="968" src="https://myifew.com/wp-content/uploads/2019/04/lambda-power-tuning-state-machine-execute.png" alt="" class="wp-image-5356"/></figure>



<p>กรอกข้อมูล State Machine Input สำหรับจะใช้ทำงาน โดยมีรูปแบบตามนี้</p>



<pre class="wp-block-code"><code>{
    "lambdaARN": "your-lambda-function-arn",
    "num": 10
}</code></pre>



<p>เช่น</p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2502" height="870" src="https://myifew.com/wp-content/uploads/2019/04/lambda-power-tuning-state-machine-execute-input-1.png" alt="" class="wp-image-5358"/></figure>



<p>รอสักครู่ จะมี Status บอกเราว่า Successed พร้อมบอกรายละเอียดการทำงาน และผลลัพธ์ ซึ่งถ้ามันขึ้นว่า Failed ให้เราไปดูที่ Exception ได้ </p>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2642" height="1250" src="https://myifew.com/wp-content/uploads/2019/04/example-lambda-power-tunning-monitoring-execution-1.png" alt="" class="wp-image-5361"/></figure>



<figure class="wp-block-image"><img loading="lazy" decoding="async" width="2606" height="1256" src="https://myifew.com/wp-content/uploads/2019/04/example-lambda-power-tunning-monitoring-execution-detail.png" alt="" class="wp-image-5360"/></figure>



<h2 class="wp-block-heading">การกำหนดค่า State Machine Input</h2>



<p>เราสามารถกำหนด parameters ของ input ได้ ดังนี้:</p>



<ul class="wp-block-list"><li><strong>lambdaARN</strong> (จำเป็น): ARN ของ Lambda Function ที่ต้องการทดสอบ</li><li><strong>num</strong> (จำเป็น): หมายเลขจำนวนที่ต้องการทดสอบเรียกใช้งาน (invocations) ต่อครั้งและต่อ Memory ที่เรากำหนด (อย่างน้อย 5, แนะนำ: 10 &#8211; 100)</li><li><strong>payload</strong> (string/object): Input สำหรับใช้ใน Lambda Function ที่ต้องการทดสอบ (ใส่เป็นข้อมูล JSON)</li><li><strong>parallelInvocation</strong> (ค่าตั้งต้น: false): ถ้าเราใส่เป็น true, จะมีการเรียก Execute พร้อมๆ กัน ตามจำนวนที่เราระบุใน num</li></ul>



<h2 class="wp-block-heading">สรุป</h2>



<p>ไม่ยากเลยใช่ไหมครับ สามารถเอาไปใช้ตรวจสอบ AWS Lambda Fucntion ของเราเองได้อย่างรวดเร็วและสะดวก ไม่ต้องทำมือเองท่ีละตัว หรือใช้วิธีการเดา เพื่อความรวดเร็ว และคุ้มค่าที่สุด</p>



<p><strong>อ้างอิง</strong></p>



<ul class="wp-block-list"><li><a href="https://serverless.com/blog/aws-lambda-power-tuning/">https://serverless.com/blog/aws-lambda-power-tuning/</a></li><li><a rel="noreferrer noopener" aria-label="https://github.com/alexcasalboni/aws-lambda-power-tuning (opens in a new tab)" href="https://github.com/alexcasalboni/aws-lambda-power-tuning" target="_blank">https://github.com/alexcasalboni/aws-lambda-power-tuning</a></li><li><a rel="noreferrer noopener" aria-label="https://www.slideshare.net/AmazonWebServices/become-a-serverless-black-belt-optimizing-your-serverless-applications-aws-online-tech-talks (opens in a new tab)" href="https://www.slideshare.net/AmazonWebServices/become-a-serverless-black-belt-optimizing-your-serverless-applications-aws-online-tech-talks" target="_blank">https://www.slideshare.net/AmazonWebServices/become-a-serverless-black-belt-optimizing-your-serverless-applications-aws-online-tech-talks</a></li></ul>
]]></content:encoded>
					
					<wfw:commentRss>https://myifew.com/5339/how-to-optimize-memory-on-aws-lambda-for-costs-and-fastest/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
