go to http://oracle.in.th

Thursday, June 17, 2010

การ set ให้ Web server เราสามารถรองรับคนจำนวนมากได้

วันนี้ผมได้รับคำถามจาก Twitter (@oracleinth) อีกแล้วครับ โดยที่คำถามเค้าได้ถามมาว่า...
"ขอถามหน่อยนะครับว่า ถ้าเราลง apache tomcat 6.x เพื่อรัน jsp เป็น Web server เราต้องเซตอะไรบ้างเพื่อให้มันรองรับคนจำนวนมากๆ ? "

ถ้าจะพูดถึงการ set ให้ Web server ของเราสามารถรองรับคนจำนวนมากนั้น สามารถทำได้หลายวิธี ซึ่งถ้าเป็นวิธีพื้นฐานเลย นั่นคือ การ set session timeout วิธีนี้ก็จะช่วยได้ในระดับนึง แต่ set session timeout นั้นมันไม่ได้ช่วยอะไรได้มากเท่าไร จากประสบการณ์ที่เคยเจอมากับตัวนะครับ แต่อีกเรื่องนึงที่พอเราไป set รับรองว่ารับคนได้เยอะขึ้นชัวร์คือไปเพิ่ม memory ให้กับ java นั่นเอง

การไป set parameter ดังนี้
JVM option passed to Resin Meaning
-Xms initial java heap size
-Xmx maximum java heap size
-Xmn the size of the heap for the young generation

แต่การเพิ่มพวกนี้ Ram ต้องเยอะด้วยนะ

การไป set ต้องไป set ที่ Environment variable ของ OS เช่นที่ Windows

set JAVA_OPTS=-Xms512m -Xmx1024m

นอกจากจะ set ที่ Environment variable ของ OS ยังไป set ที่ Tomcat ตรงๆได้ ไป set ที่ file %TOMCAT_HOME%\bin\catalina.bat
ไป search ที่ parameter JAVA_OPTS แล้วไปแก้ไขตรงนั้น

ที่เห็นผลได้ชัดเจน client รองรับได้เยอะขึ้น

...จะบอกว่าการ config อย่างเดียวมันก็ไม่ได้ช่วยได้ที่จะทำให้ Tomcat รองรับได้เยอะขึ้น
อย่างการเพิ่ม memory ให้กับ java, การ set session timeout เป็นการแก้ปัญหาที่ปลายเหตุทั้งสิ้น ถึงการแก้แบบนี้จะรองรับ client ได้เยอะขึ้นแต่เอาเข้าจริงไม่มีทางเกินหลักพัน (ใช้พร้อมกัน) เคยลองใช้ jmeter ลองจำลอง client พันตัวพร้อมกันก็ไม่ไหวแล้ว

พอดีผมได้ฟังประสบการณ์ที่มาจากรุ่นพี่ ซึ่งเค้าเคยทำงานกับ web ที่ uip เป็นหลักหมื่นต่อวัน
ซึ่ง web นี้ใช้ php เป็นภาษา developer ส่วน database ก็เป็นเพียง mysql หรือง่ายๆก็คือ LAMP

ผมเลยถามเค้าว่าทำยังไงถึงได้รองรับ user ได้เยอะขนาดนี้ ?
เค้าก็ตอบว่าทำ web ยังไงก็ได้อย่าให้มีการติดต่อ database เป็นดีที่สุด อย่าไปดึงมาเด็ดขายไม่งั้น web ล่มแน่
พี่เค้าก็บอกว่า เชื่อหรือไม่ว่าหน้าแรกของ web ดังทั้งหลายในไทยเป็น HTML ล้วนๆ โดยจะมีการ generate หน้าแรกตั้งทิ้งไว้เป็น HTML จากนั้นเวลาที่ใครมาเรียกก็จะเรียกจากหน้าที่ generate นั้น (ตรงนี้การแยก HTTP server กับ Servlet Container ออกจากกันจะช่วยให้ทำงานได้ดีมากขึ้น เพราะ PHP ก็ต้องแยกเหมือนกัน)

แล้วผมก็ถามต่อว่าถ้าเป็นหน้าข่าวที่มีคน comment เรื่อยๆหละจะทำยังไง เค้าบอกว่าใช้เทคโนโลยี Caches เข้ามาช่วย จะทำการติดต่อ database ก็ต่อเมื่อ insert, update, และ delete เท่านั้น ถ้าจะ select จะ select แค่ครั้งเดียวเท่านั้น แต่จะ select ใหม่ถ้ามีการ update โดยข้อมูลทั้งหมดจะถูกเก็บลง cache ทั้งหมด ที่ต้องเก็บลง cache ทั้งหมดนั้นจะดีกว่าการ select ใหม่ทุกครั้ง เพราะจะมี overhead สูงมากในการติดต่อ DB

ซึ่งใน java นั้นก็มีอยู่นะ เยอะด้วยยกตัวอย่าง Coherence Caches ของ oracle http://www.oracle.com/technology/pub/articles/vohra-coherence.html ซึ่งเคยได้ยินมา แต่ไม่เคยทดลองเล่นดู...

นอกจาก database cache แล้วใน java ยังมี lib หลายๆส่วนที่สามารถทำ cache ได้ อย่างเช่น connection cache ของการติดต่อ DB (Connection Pooling), การทำ cache ของ object เป็นต้น

และมีอีกประเด็นที่จะเสริมเกี่ยวกับการใช้งาน tomcat เพื่อรับ load จำนวนมาก ควร config tomcat เข้ากับ apache(http server) เพื่อแยกงานการ render web (html) กับงานประมวลผล Java ออกจากกัน
จะทำให้ประสิทธิภาพโดยรวมดีขึ้น

ดูที่ http://tomcat.apache.org/connectors-doc/webserver_howto/apache.html

Credit by @plaumkamon, Kim
ข้อเขียนนี้ช่วยฉัน:  

3 comments:

Anonymous said...

แจ่มมากครับ

Unknown said...

ถ้ากำลังพบปัญหานี้อยู่ ผมว่าควรวิเคราะห์ที่ต้นตอมันก่อนครับ เครื่องมือช่วยวิเคราะห์ปัญหา
profiler: YourKit http://www.yourkit.com
performance benchmarking: Apache JMeter http://jakarta.apache.org/jmeter/index.html
monitoring mem, cpu: lambdaprobe http://www.lambdaprobe.org/d/index.htm

วิธีต่างๆ บทความอธิบายไว้แล้ว ขอเสริมครับ
มองแค่มุม web server ไม่เข้าเรื่อง app/db tuning
- ทำ load balancer กระจายงาน
- หรือกระจายงานให้ HTTP server ก่อนส่งให้ servlet container ทำงาน
- ทำ clustered ช่วยเรื่อง failover

:)

Oracle In Thai said...

ขอบคุณ @Phamonyut นะครับ มาช่วยเสริมได้อย่างดีเลย

Post a Comment