Nine MVP's Blog

17/04/2011

ASP.NET 4.0 : High Scalable ASP.NET Session and Cache with Windows Server AppFabric Caching vol.1

Filed under: ASP.NET, Core System — Tags: , — Nine MVP @ 1:10 am
Part 1
Part 2

Programming Level:

  • Intermediate

Computer Skills:

  1. ASP.NET 4.0

Development Tool and Library

  1. OS: Windows 7 or Windows Server 2008 R2
  2. Windows Server AppFabric Caching (download for x86, for x64)

Agenda

  • Introduce
  • ASP.NET Session Problem
  • ASP.NET Session Mode
  • Solution for Large Session State Problem
  • Advantages of AppFabric Caching
  • AppFabric Caching Architecture
  • Install And Config Windows Server AppFabric Caching (Non-Cluster)
  • Using Caching Administration Windows PowerShell
  • Summary

Introduce

หลายๆครั้งที่มีการถามถึงประสิทธิภาพการทำงานของ ASP.NET ในเรื่องการความเร็วตั้งแต่กด Request เข้าไปยัง Server จนกระทั้ง Response ข้อมูลออกมายัง Browser ของผู้ใช้งาน     ซึ่งมีหลายปัจจัยทีเดียวที่จะต้องออกแบบและปรัปปรุงขั้นตอนการทำงานเพื่อให้ตอบสนองผู้ใช้ได้อย่างรวดเร็วไม่ว่าจะเป็นในส่วนของการ Tuning Database เพิ่มความเร็วในการ Query Data, การใช้ paging query, เขียน code logic ให้มีประสิทธิภาพ, ออกแบบหน้า html, image ให้มีสัดส่วนที่เหมาะสม ขนาดเล็ก, การบีบอัดข้อมูลจาก Web Server ไปยัง browser ของผู้ใช้  รวมไปถึงการทำ Network Load Balance(NLB) เป็นต้น

ซึ่งวิธีการเหล่านี้ก็เป็นส่วนสำคัญในการสร้างระบบที่มีการทำงานที่รวดเร็วโดยทั้งหมด  แต่ปัจจัยที่สำคัญมากอีกตัวก็คือหน่วยความจำสำหรับระบบนั้นเอง โดยส่วนใหญ่มักจะมีปัญหาในการใช้งานเมื่อจำนวนยูสเซอร์มีจำนวนมากขึ้น โดยระบบหน่วยความจำที่สำคัญนั้นคือการใช้ Session, Internal Cache แม้จะมีหลายท่านพยายามหนีการใช้เซสชั่นแต่มั่นใจได้ครับ ไม่ทุกระบบที่จะหลีกเลี่ยงได้ หากเจอข้อจำกัดในการ load data และเงื่อนไขที่รัดตัว

ASP.NET Session Problem

สำหรับงานเว็บของ ASP.NET นั้น หลายๆระบบต่างไม่ได้ให้ความสำคัญในการกำหนด physical memory สำหรับใช้เก็บเซสชั่น โดยส่วนใหญ่จะใช้ค่า default ที่ Visual Studio สร้าง web.config มาให้ หากคุณใช้เครื่อง Web Server ที่มีเสป็คสูงก็อาจจะไม่ต้องกังวล เช่น มี RAM 8-16 GB เป็นต้น  แต่หาก web server ต้องติดตั้ง web app มากกว่า 1 ระบบแล้วนั้น มีโอกาสที่จะทำให้เกิดปัญหาเรื่องหน่วยความจำไม่พอ ซึ่งเอกชนส่วนใหญ่จะใช้การติดตั้งลักษณะนี้เนื่องจากประหยัดค่าใช้จ่าย

ในการทำงานบ่อยครั้งก็มีความจำเป็นในการโหลดข้อมูลจาก Database เข้ามาเก็บในเซสชั่น หลายๆครั้งนั้นมีความจำเป็นที่เลี่ยงไม่ได้ที่จะต้องโหลดข้อมูลจำนวนมาก ๆ เข้ามาเก็บไว้ เช่น Global Data สำหรับแชร์ให้ทุกเซสชั่น, ข้อมูลเพื่อรองรับการทำงานของยูสเซอร์กำลังใช้งานเว็บ เมื่อจำนวนยูสเซอร์มีการเข้าใช้งานในประมาณที่มากขึ้นจึงทำให้ IIS process มีขนาดใหญ่บางท่านอาจจะเจอว่ากิน ram ไปขนาด 4 GB. ทำให้ต้องมีการ upgrade web server อาจจะต้องเพิ่ม RAM หรือเพิ่ม server เป็นต้น

ASP.NET Session Model

เพื่อความเข้าใจในการแก้ปัญหาและพัฒนา ผมขออธิบายเกี่ยวกับ Session Mode ของ ASP.NET ที่มีอยู่ 5 Mode กันก่อนครับ

1. InProc mode เป็นโหมดที่ทำงานโดยเก็บข้อมูลไว้ใน RAM ของ Web Server ซึ่งเป็นโหมดพื้นฐานที่ตั้งค่ามาให้ใช้งาน

ข้อดี ง่ายและเป็นโหมดที่ทำงานได้เร็วทีสุด

ข้อเสีย แต่มีข้อจำกัดในการรองรับจำนวนข้อมูลและการแชร์ session ใน Farm และเมื่อ web server restart ทุกอย่างที่เก็บไว้ก็จะหายไปทันที

2. StateServer (OutProc) mode เป็นโหมดที่ทำงานโดยแยก Service ที่เป็นส่วนเสริมของ ASP.NET เองออกไปจาก IIS process ซึ่งมีชื่อว่า ASP.NET state service โดยจะมีติดตั้งให้ทันทีที่ลง .NET Framework ซึ่งจะอยู่ที่ “systemroot\Microsoft.NET\Framework\versionNumber\aspnet_state.exe”

ข้อดี ด้วยตัว state server นี้แม้หากว่า web server เกิด restart ตัวเองขึ้นมาคุณก็แน่ใจได้ว่าเซสชั่นนั้นยังคงถูกเก็บไว้อยู่แน่นอน ซึ่งเหมาะที่จะใช้สำหรับ Web Server ใน Farm และมีความเร็วในการทำงานเป็นลำดับรองจาก InProc Mode อยู่ 1 เท่าตัว

ข้อเสีย คือกิน RAM เหมือน InProc เพราะเก็บไว้ใน RAM เหมือนกับ InProc mode เพียงแต่แยก service ออกมาต่างหาก แปลว่าคุณควรจะมีเครื่องแยกออกมาและมีช่องเสียบ RAM เยอะๆ และเสียบ RAM ไว้เพื่อรองรับงานดังกล่าว แต่เมื่อ StateServer restart ทุกเซสชั่นก็จะหายไปหมดเช่นกัน

ตัวอย่าง web.config

<configuration>
  <system.web>
    <sessionStatemode=StateServerstateConnectionString=tcpip=SampleStateServer:42424
                  cookieless=falsetimeout=20/>
  </system.web>
</configuration>

3. SQLServer mode เป็นโหมดที่เก็บเซสชั่นไว้ใน Database

ข้อดี คุณสมบัติเหมือนกับ StateServer mode ทุกอย่าง และถึงแม้ว่า SqlServer จะ restart ข้อมูลเซสชั่นก็ยังคงถูกเก็บเอาไว้ใน Database ไม่หายไป และดีกว่าที่ว่าสามารถขยายความจุของเซสชั่นได้เท่ากับพื้นที่บน HDD ที่มีอยู่ เหมาะที่ใช้กับ Web Server ใน Farm

ข้อเสียที่ว่า ช้ากว่า InProc mode ประมาณ 3 เท่าตัว

ตัวอย่าง web.config

<configuration>
  <system.web>
    <sessionStatemode=SQLServersqlConnectionString=
                  Integrated Security=SSPI;data source=SampleSqlServer; />
  </system.web>
</configuration>

*** หากต้องการจะใช้งาน SqlServer Mode คุณต้องทำการ register database ด้วย aspnet_regsql.exe ตัวนี้ก่อน

4. Custom mode หาตัวอื่นมาใช้ทดแทนทั้ง 3 mode ที่กล่าวไปข้างต้น โดยอาจจะเก็บไว้ใน Disk, NoSql เป็นต้น ซึ่งเราจะมาพูดคุยและทดสอบใช้งานกันในตอนนี้

5. Off mode ไม่ใช้ Session (ฟังดูจะโหดร้ายไปหน่อย)

Solution for Large Session State Problem

แนวทางการการแก้ไขปัญหาเรื่อง RAM บน Web Server ไม่พอเพียงนั้น ก็มีแนวทางที่เป็น best practice ให้เห็นกันอยู่แล้วนะครับก็คือ

1. เลือกใช้ SQLServer Mode  โดยตัวอย่างก็มีเช่น SharePoint, MS CRM  ก็ถูกพัฒนา base on ASP.NET เช่นกัน ซึ่งได้เลือกที่จะแก้ปัญหานี้ด้วยการใช้ SQLServer Mode เป็นตัวเก็บ Session ซึ่งก็จะหมดปัญหาในเรื่อง web app ที่ต้องใช้หน่วยความจำขนาดใหญ่อีกต่อไป อาจจะทำงานช้าลงบ้างแต่ก็คุ้ม

2. เลือกใช้ Custom Mode อาจจะมองหา Distributed Cached System ที่ดีๆมาใช้งานเช่น Windows Server AppFabric Caching (velocity), MemCached, NCache เป็นต้น

ในตอนนี้ขอเลือก Custom Mode มาใช้แก้ปัญหาของ Server Memory โดยใช้ AppFabric Caching

Advantages of AppFabric Caching

1. ทำงานเร็วกว่า SqlServer mode 4 เท่า

2. ฟรีสำหรับ windows server 2008, windows 7

3. มี Client library สำหรับ .NET ให้ใช้งาน

4. สั่งงานได้จาก powershell และมี management tool ที่ใช้งานง่าย

5. High Availability ทำงานแบบ cluster node ได้ (for windows server 2008 enterprise edition only)

AppFabic Caching Architecture

image

Physical Architecture Diagram

กรณีที่ต้องทำ Web Server Farm การทำ Cluster node นั้นเป็นสิ่งจำเป็น จากรูปด้านบนนี้ จะเห็นว่า Cache Server นั้นมีจำนวน 3 Nodes โดยใช้ Cluster configuration Strorage location ที่เดียวกัน (ต้องอยู่ใน AD เท่านั้นถึงจะทำ cluster ได้) และก็สามารถเพิ่ม node เข้าไปได้อีก เพื่อรองรับการร้องขอเก็บบันทึกและอ่านข้อมูล Session/Cache ตามที่ต้องการ  โดยสามารถจัดการทั้ง cluster ได้โดยผ่าน PowerShell

image

Logical Architecture Diagram

จาก logical diagram ด้านบนนี้จะเห็นได้ว่าภายใน Cache Cluster นั้นมี Cache Host อยู่ 3 ตัว   และแถบเหลือง ๆ ก็คือ Cache มีไว้ใช้เก็บข้อมูลโดย Default Cache จะมีมาให้เสมอหลังติดตั้ง ส่วน Inventory และ Catalog นั้นเป็นส่วนที่สร้างเพิ่มเติม

สังเกตุว่า cache สามารถ Replicate ไปยัง Cache Host ทั้ง 3 ตัวได้  แต่การกำหนด Data Region นั้นจะไม่สามารถ replicate ข้อมูลได้

Install And Config Windows Server AppFabric Caching (Non-Cluster)

ก่อนอื่นตรวจาสอบว่าในเครื่องได้ติดตั้ง IIS 7 Manager for Remote Administration แล้วหรือไม่ ถ้ายังไม่ติดตั้ง ก็ดาวโหลดมาติดตั้งเสียก่อน

จากนั้นค่อยไป download AppFabric (for x86, for x64)

1. เมื่อรัน *.msi ติดตั้งขั้นตอนแรก

image

2.  ให้กดเลือก checkbox ทั้งสอง จากนั้น monitoring provider เลือก System.Data.SqlClient และ Persistance provider ให้เลือก sqlStoreProvider และกดปุ่ม configure.. โดยทำซ้ำตามขั้นตอนถัดไปทั้ง 2 ปุ่ม

image

3.  จากนั้นไปสร้าง database สำหรับเก็บ Cache ของเรา ผมได้สร้าง AppFabricMonitoringDB และ AppFabricPersistanceDB ไว้ใน SQL Server ก่อนนี้แล้ว

จากนั้นกด checkbox ทั้งสองตามรูปด้านล่างและเลือก Database ที่ได้สร้างไว้

image

4.  กดปุ่ม install

a4

5. เมื่อ install เสร็จก็จได้ภาพนี้ สังเกตุจะมี checkbox ถามว่าให้รัน configuration tool เลยหรือไม่

จากนั้นกด Finish

a5

6. ก็จะได้หน้าจอของตัว Configuration Wizard มา

a6

7. เช็คเลือก Set Caching Service config  เปลี่ยน Service Account เป็นชื่อ user ที่ต้องการ

ผมเลือก caching service configuration provider เป็น XML เนื่องจากติดตั้งบน Windows7 จึงไม่สามารถทำ Cluster ได้

และกำหนด ShareFolder ชื่อว่า \\Nine-NB\AppFabricCacheXml เอาไว้เก็บ xml config file

image

8.  กำหนด port สำหรับ Service ต่าง ๆ จะแก้ไขตามต้องการก็ได้ (ห้ามใช้ port ซ้ำกัน)

ตรวจเช็คว่าเครื่องตัวเองไม่ได้ติดตั้ง Firewall เพราะจะทำให้ติดต่อกับ service ไม่ได้

a8

9.  จบขั้นตอนการติดตั้ง

image

10. ก็จะ start IIS7 ขึ้นมาตามรูปและมี AppFabric Section เพิ่มเข้ามาตามภาพ

image

11. หลังจากติดตั้งเสร็จแล้วก็ลองมาตรวจสอบที่ Start –> Program –> Windows Server AppFabric  จะพบรายการดังนี้

a9

Using Caching Administration Windows PowerShell

ไปที่ Start –> All Programs –> Windows Server AppFabric

เลือก Caching Administration Windows PowerShell จะได้หน้าต่างตามนี้

image

1. Start-CacheCluster พิมพ์คำสั่งเพื่อสั่งให้ cache service เริ่มทำงาน จะได้เห็นว่า service กำลัง start

image

และจะพบว่า Service จะมี Status เป็น UP

image

2. Stop-CacheCluster  เป็นคำสั่งเพื่อ shutdown service

3. Restart-CacheCluster เป็นคำสั่งให้ Restart service

4. Get-CacheClusterHealth เป็นคำสั่งเพื่อตรวจดูสถานะของ service ว่าปัจจุบันเป็นอย่างไร

image

5. Grant-CacheAllowedClientAccount เป็นคำสั่ง Add Client Account เพื่อเข้าใช้งานระบบ cache

image

6. Get-Cache จะลิสรายการ cache ออกมาแสดงทั้ง cluster

image

7. New-Cache เป็นคำสั่งสร้าง cache

image

8. Get-CacheConfig  เป็นคำสั่งในการเรียกดูค่าคอนฟิกของ cache แต่ละตัว (ระวัง cache name เป็น case sensitive)

image

9. Set-CacheConfig เป็นคำสั่งในการตั้งค่าคอนฟิกให้ cache

10 Get-CacheStatistics เป็นคำสั่งในการดูค่าการทำงานที่ผ่านมาของ cache ตัวนั้น ๆ

image

11. Remove-Cache  เป็นคำสั่งในการลบ cache ตัวที่ต้องการ

image

*** get more information : Cache Administration with Windows PowerShell (Windows Server AppFabric Caching)

Summary

ในตอนนี้เราได้ทำความรู้จักกับปัญหาของเซสชั่นและทำความรู้จักกับ AppFabric Caching รวมไปถึงการติดตั้งและการใช้คำสั่งในการทำงานกับตัว Cache Cluster ในตอนหน้าเราจะมาย้าย ASP.NET Session ไปเก็บลงใน AppFabric Caching กันครับ


Chalermpon Areepong Nine (นาย)

Microsoft MVP Thailand ASP.NET

email : nine_biz-talk.net at hotmail dot com

4 Comments »

  1. […] หลังจากที่ผมได้เขียนเกี่ยวกับ AppFabric ไปเมื่อ4ปีก่อน เกี่ยวกับการนำมาใช้เป็น cache สำหรับ ASP.NET Application อ่านที่นี่ […]

    Pingback by April 2015 - MVC Rocks Developer Group — 10/04/2015 @ 7:34 am

  2. […] หลังจากที่ผมได้เขียนเกี่ยวกับ AppFabric ไปเมื่อ4ปีก่อน เกี่ยวกับการนำมาใช้เป็น cache สำหรับ ASP.NET Application อ่านที่นี่ […]

    Pingback by อนาคตที่ริบหรี่ Microsoft AppFabric - MVC Rocks Developer Group — 10/04/2015 @ 7:51 am

  3. […] หลังจากที่ผมได้เขียนเกี่ยวกับ AppFabric ไปเมื่อ4ปีก่อน เกี่ยวกับการนำมาใช้เป็น cache สำหรับ ASP.NET Application อ่านที่นี่ […]

    Pingback by The Death of Microsoft AppFabric - MVC Rocks Developer Group — 10/04/2015 @ 7:57 am


RSS feed for comments on this post. TrackBack URI

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

Create a free website or blog at WordPress.com.

%d bloggers like this: