Thursday, August 04, 2005

ตัวอย่าง AppServer Performance Tuning

เห็น theserverside.com ลงข่าวเรื่องที่ BEA ทำคะแนน
SPECjAppServer ได้สูงสุด ก็เลยตามเข้าไปดู
ที่ได้ติดมือมาก็คือได้เห็น tuning parameter ที่เขาใช้
เลยขอ Note ไว้เพื่อไปศึกษาต่อ โดยดูเฉพาะของ WebSphere ก่อน

WebSphere 's Parameters


MaxConnectBacklog = 1024
จำนวน connection ที่ยอมให้ค้างอยู่ใน buffer
ก่อนที่ server จะ reject ทิ้ง
ค่า default อยู่ที่ 511
Note: ค่านี้ไม่ได้สัมพันธ์กับจำนวน user แบบ 1:1
เพราะว่า browser สามารถเปิด connection ได้หลาย thread พร้อมกัน

MaxKeepAliveRequests = 10
ค่านี้น่าสนใจ (อาจจะตั้งน้อยเพราะเหมาะกับธรรมชาติของ benchmark นี้)
ในคุ่มือ ibm แนะนำไว้ว่าควรมีค่า = 90% ของ web container thread pool
่ใน benchmark นี้ ibm ตั้งไว้ที่ 10 (คิดเป็น 20 % ของ Maximum Thread pool)

2 ค่านี้ search หาใน internet ไม่เจอ
com.ibm.ws.pm.batch=true
com.ibm.ws.pm.deferredcreate=true

Linux 's Parameters


ของ Ibm SีuSE มีการ config sysctl.conf

net.core.netdev_max_backlog = 600
net.core.somaxconn = 1024
ตั้ง backlog ให้เยอะขึ้น (ใครเก่ง network ช่วยบอกด้วยว่า
ไอ้ 2 ค่าบนนี้มันต่างกันอย่างไร)
ส่วนใน BEA config เล่นตั้ง 2 ค่านี้ซะเวอร์เลย ตั้งไว้ตั้ง 20000

net.ipv4.tcp_fin_timeout = 30
ตั้งค่าน้อยๆเพื่อให้ reuse resource ได้เร็วขึ้น

kernel.shmmax=1073741824
ส่วนนี้เกี่ยวกับ Heapsize ของ Virtual Machine ด้วย
ในคุ่มือ Websphere แนะไว้ว่า
Set the maximum shared segment size to 2300MB plus a little more (about 95MB) (2511724800 = 2300 * 1048576 + 100000000)

(default ของ kernel คือ 32 Mb)
อ่านดูในเอกสาร ส่วนใหญ่มักจะเปลี่ยนให้ค่า shmall เป็นค่าเดียวกันด้วย
แต่ใน config นี้ไม่ได้พูดถึงค่านี้
(ฺBEA ตั้งค่านี้ไว้ 4294967295)

kernel.sched_yield_scale=1
ค่านี้เป็นเรื่องของ SuSE โดยเฉพาะ กรณี SuSE version < 8 SP2A

vm.bdflush=100 1200 128 512 15 5000 100 0 0
ค่านี้เกี่ยวกับ virtual memory
เห็นในเอกสาร Securing and Optimizing Linux บอกไว้ว่าใน redhat default ตั้งค่านี้ไว้ที่
40 500 64 256 500 3000 500 1884 2
ตัวเลขตัวแรกคือ % ของ dirty cache ก่อนที่จะ flush
Setting this to a high value means that Linux can delay disk writes for a long time

ตัวเลขที่ 2 คือ maximum number of dirty buffers that bdflush can write to the disk in one time
ตัวที่ 3 คือ This is the number of buffers that bdflush will add to the list of free buffers when refill_freelist() is called.
ตัวที่ 4 ไม่ค่อยต่างกัน เลยไม่สนใจ
ตัวที่ 5 นี่เกีี่ยวกับ age_buffer ลดลงเยอะมากเลย
อันนี้งงๆ เพราะหน่วงเวลาการ write ด้วย parameter ตัวที่ 1
แต่กลับให้ age_buffer มีอายุน้อยลง

net.ipv4.tcp_synack_retries = 20
fs.file-max=65535
net.ipv4.tcp_sack=0
net.ipv4.tcp_timestamps=0
2 อันหลังนี้รู้สึกจะปิด feature บางอย่างลงไป

ค่าที่เกี่ยวกับ network ลองอ่านเพิ่มเติมได้จาก
Squeeze Your Gigabit NIC for Top Performance
How to achieve Gigabit speeds with Linux
Enabling High Performance Data Transfers
http://www.bur.st/~paul/linux_tuning.txt

ถ้าใครอยากลอง run benchmark นี้บนเครื่องตัวเองบ้าง
ก็เพียงแต่แคะกระปุกออกมา $2000 เท่านั้นเอง

Related link from Roti

No comments: