Part 1
Part 2
Programming Level:
Computer Skills:
- ASP.NET 4.0
Development Tool and Library
- OS: Windows 7 or Windows Server 2008 R2
- 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=“StateServer“stateConnectionString=“tcpip=SampleStateServer:42424“
cookieless=“false“timeout=“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=“SQLServer“sqlConnectionString=
“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

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

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 ติดตั้งขั้นตอนแรก

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

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

4. กดปุ่ม install

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

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

7. เช็คเลือก Set Caching Service config เปลี่ยน Service Account เป็นชื่อ user ที่ต้องการ
ผมเลือก caching service configuration provider เป็น XML เนื่องจากติดตั้งบน Windows7 จึงไม่สามารถทำ Cluster ได้
และกำหนด ShareFolder ชื่อว่า \\Nine-NB\AppFabricCacheXml เอาไว้เก็บ xml config file

8. กำหนด port สำหรับ Service ต่าง ๆ จะแก้ไขตามต้องการก็ได้ (ห้ามใช้ port ซ้ำกัน)
ตรวจเช็คว่าเครื่องตัวเองไม่ได้ติดตั้ง Firewall เพราะจะทำให้ติดต่อกับ service ไม่ได้

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

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

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

Using Caching Administration Windows PowerShell
ไปที่ Start –> All Programs –> Windows Server AppFabric
เลือก Caching Administration Windows PowerShell จะได้หน้าต่างตามนี้

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

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

2. Stop-CacheCluster เป็นคำสั่งเพื่อ shutdown service
3. Restart-CacheCluster เป็นคำสั่งให้ Restart service
4. Get-CacheClusterHealth เป็นคำสั่งเพื่อตรวจดูสถานะของ service ว่าปัจจุบันเป็นอย่างไร

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

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

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

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

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

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

*** 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