ทดสอบเว็บเซิร์ฟเวอร์ด้วย ab (ApacheBench)

ดีฟอลต์คอนฟิกที่ได้จากการติดตั้งโปรแกรมจากไฟล์ rpm หรือ วิธีอื่นๆ นั้น สามารถนำมาใช้งานและทำงานได้ในระดับหนึ่ง

แต่ถ้าโปรแกรมเช่นเว็บเซิร์ฟเวอร์ ถ้าต้องให้บริการต่อผู้ใช้จำนวนมากขึ้น จำเป็นต้องปรับแต่งคอนฟิกเพิ่มเติม เพื่อให้ใช้ฮาร์ดแวร์ของเครื่องได้เต็มประสิทธิภาพ

ab เป็นโปรแกรมทดสอบเว็บเซิร์ฟเวอร์อย่างง่ายๆ โปรแกรมหนึ่งที่ติดตั้งมาพร้อมกับ Apache Web Server ถ้าเป็นไฟล์ rpm ก็อยู่ใน httpd-tools

เราสามารถนำ ab มาใช้ทดสอบเพื่อวัดผลได้ว่า เว็บเซิร์ฟเวอร์ที่กำลังแก้ไขคอนฟิกอยู่นั้น สามารถรองรับการใช้งานได้เท่าไร (requests per second) หากเราเปลี่ยนคอนฟิกไป ผลที่ได้จะเป็นอย่างไร

สร้างไฟล์ทดสอบด้วยคำสั่ง echo ตามตัวอย่าง

[root@cent6 ~]# echo 'hello' > /var/www/html/test.html
[root@cent6 ~]# cat /var/www/html/test.html
hello
[root@cent6 ~]# ls -l /var/www/html/test.html
-rw-r--r--. 1 root root 6 Jun  9 14:29 /var/www/html/test.html

หมายเหตุ สังเกตว่า ไฟล์เว็บ test.html ที่สร้างประกอบด้วยตัวอักษรเพียง 5 ตัวเท่านั้น แต่เมื่อใช้คำสั่ง ls -l ดูขนาดไฟล์กลายเป็นมีขนาด 6 bytes เป็นเพราะว่า คำสั่ง  echo ถ้าไม่ได้ระบุออปชั่น “-n” จะมีอักขระพิเศษซ่อนอยู่คือ new line “\n” ต่อท้ายมาด้วย ซึ่งถ้าต้องการดู สามารถใช้คำสั่ง od เพื่อดูได้

[root@cent6 ~]# od -c /var/www/html/test.html
0000000   h   e   l   l   o  \n
0000006

 

รันคำสั่ง ab

ไม่จำเป็นต้องรันคำสั่ง ab บนเครื่องเว็บเซิร์ฟเวอร์ที่เรากำลังแก้ไขคอนฟิกอยู่ สามารถรันบนเครื่องไหนก็ได้ แล้วก็สามารถทดสอบไปเว็บเซิร์ฟเวอร์ที่ไหนก็ได้

รูปแบบการใช้ก็ง่ายเพียงแค่รันคำสั่ง ab แล้วตามด้วยออปชั่น (ถ้ามี) แล้วตามด้วย url ของเว็บไซต์

ตัวอย่างการรันคำสั่ง ab ไม่ระบุออปชั่นเพื่อทดสอบ www.google.com

[user1@client ~]$ ab http://www.google.com/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking www.google.com (be patient).....done

Server Software:        gws
Server Hostname:        www.google.com
Server Port:            80

Document Path:          /
Document Length:        221 bytes

Concurrency Level:      1
Time taken for tests:   0.182 seconds
Complete requests:      1
Failed requests:        0
Write errors:           0
Non-2xx responses:      1
Total transferred:      2058 bytes
HTML transferred:       221 bytes
Requests per second:    5.48 [#/sec] (mean)
Time per request:       182.327 [ms] (mean)
Time per request:       182.327 [ms] (mean, across all concurrent requests)
Transfer rate:          11.02 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       51   51   0.0     51      51
Processing:   131  131   0.0    131     131
Waiting:      122  122   0.0    122     122
Total:        182  182   0.0    182     182

หากไม่ได้ระบุออปชั่นใดๆ เลย จะเป็นการทดสอบเข้าเว็บไซต์ url นั้นเพียงครั้งเดียว แต่ถ้าต้องการระบุจำนวนครั้งในการทดสอบ (Number of requests) ต้องระบุออปชั่น “-n” และ

ถ้าต้องการส่งทดสอบพร้อมๆ กัน (concurrency) ให้ระบุออปชั่น “-c”

เช่น ต้องการทดสอบเว็บเซิร์ฟเวอร์ http://192.168.5.62  จำนวนทั้งหมด 100 ครั้ง แต่ให้ส่งการทดสอบพร้อมๆ กัน (concurrency) ครั้งละ 20 สามารถทำได้ดังนี้

[user1@client ~]$ ab -n 100 -c 20 http://192.168.5.62/test.html
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.5.62 (be patient).....done

Server Software:        Apache/2.2.15
Server Hostname:        192.168.5.62
Server Port:            80

Document Path:          /test.html
Document Length:        6 bytes

Concurrency Level:      20
Time taken for tests:   0.189 seconds
Complete requests:      100
Failed requests:        0
Write errors:           0
Total transferred:      28016 bytes
HTML transferred:       618 bytes
Requests per second:    528.76 [#/sec] (mean)
Time per request:       37.824 [ms] (mean)
Time per request:       1.891 [ms] (mean, across all concurrent requests)
Transfer rate:          144.67 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    8  10.5      5      34
Processing:     7   27  26.8     12     115
Waiting:        5   26  25.8     11     112
Total:         12   36  33.1     16     133

Percentage of the requests served within a certain time (ms)
  50%     16
  66%     24
  75%     51
  80%     57
  90%     95
  95%    118
  98%    133
  99%    133
 100%    133 (longest request)

เราสามารถนำผลลัพธ์ที่ได้ ไปใช้เปรียบเทียบก่อนและหลังการเปลี่ยนคอนฟิกของเว็บเซิร์ฟเวอร์

socket: Too many open files

หากระบุออปชั่น -c เป็นจำนวนมากกว่า 1024 จะขึ้น error แบบนี้

[user1@client ~]$ ab -n 10000 -c 2000 http://192.168.5.62/test.html
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.5.62 (be patient)
socket: Too many open files (24)

 

สาเหตุเป็นเพราะดีฟอลต์จำนวนการเปิดไฟล์สูงสุด (open files) ของแต่ละ user ในลีนุกซ์หลายๆ เวอร์ชั่น เช่น CentOS กำหนดไว้แค่ 1024 เท่านั้น หากผู้ใช้รันโปรแกรม (concurrency) มากกว่านี้ จะทำให้เกิด error

ใช้คำสั่ง ulimit -n เพื่อดูค่านี้ได้

[user1@client ~]$ ulimit -n
1024

เราสามารถเพิ่มจำนวนการเปิดไฟล์สูงสุดนี้ได้ ในไฟล์ /etc/security/limits.conf

ค่าสูงสุดดูได้จากไฟล์ /proc/sys/fs/file-max  ที่จริง เราก็สามารถแก้ไขค่านี้ได้เหมือนกัน แต่ในที่นี้ขอไม่พูดถึง

[root@cent6 ~]# cat /proc/sys/fs/file-max
98305

ใช้ root เพื่อแก้ไขไฟล์ limits.conf

[root@cent6 ~]# cat /etc/security/limits.conf
# /etc/security/limits.conf
#
#Each line describes a limit for a user in the form:
#
#<domain>        <type>  <item>  <value>
#
#Where:
#<domain> can be:
#        - an user name
#        - a group name, with @group syntax
#        - the wildcard *, for default entry
#        - the wildcard %, can be also used with %group syntax,
#                 for maxlogin limit
#
#<type> can have the two values:
#        - "soft" for enforcing the soft limits
#        - "hard" for enforcing hard limits
#
#<item> can be one of the following:
#        - core - limits the core file size (KB)
#        - data - max data size (KB)
#        - fsize - maximum filesize (KB)
#        - memlock - max locked-in-memory address space (KB)
#        - nofile - max number of open files

...

#<domain>      <type>  <item>         <value>
#

*               -       nofile           5000

# End of file

 

การแก้ไขตามตัวอย่างด้านบนคือกำหนดให้ user ทุกคน (*) ทั้งค่า hard และ soft (-) สามารถเปิดไฟล์ได้สูงสุด (nofile) เท่ากับ 5000 ไฟล์

แล้วล็อกอินด้วย user อีกครั้ง  ลองใช้คำสั่ง ulimit -n เพื่อดูค่าที่เพิ่มขึ้น

[user1@client ~]$ ulimit -n
5000

ลองรัน ab ทดสอบใหม่อีกครั้ง

[user1@client ~]$ ab -n 10000 -c 2000 http://192.168.5.62/test.html
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.5.62 (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
...

 

ข้อมูลอ้างอิง

  • man ab หรือ ab -h

 

Leave a Reply

Your email address will not be published.