Sinh bài viết

Một phần của tài liệu NGHIÊN CỨU ẢNH HƯỞNG CỦA CACHING ĐẾN HIỆU NĂNG TRUY VẤN CỦA CÁC ỨNG DỤNG WEB (Trang 50 - 67)

4 Cài đặt một ứng dụng thử nghiệm và đánh giá hiệu năng

4.16Sinh bài viết

4.3 Thống kê, giám sát

Trong mục trước, chúng ta đã xây dựng được một trang web và tích hợp nó vơi memcached. Mục này, chúng ta sẽ tìm hiểu công cụ để giám sát, thống kê và đánh giá hiệu năng mà memcached và query cache mang lại cho trang web của chúng ta. Để thống kê, giám sát, chúng ta sẽ sử dụng phần mềm MRTG (Multi Router Traffic Grapher) - là một công cụ miễn phí để giám sát lưu lượng trên mạng. MRTG tạo ra các trang web chứa các ảnh dạng PNG, các ảnh này là biểu đồ thể hiện lưu lượng của mạng.

các thông số lấy được thông qua giao thức SNMP. Trong phần đầu của chương, chúng ta sẽ đi nghiên cứu sử dụng MRTG để giám sát, thống kê các thông số trạng thái của memcached và query cache. Phần cuối của chương, chúng ta sẽ tìm hiểu sử dụng công cụ đánh giá hiệu năng ab (Apache Bench) để đánh giá về thời gian phản hồi của máy chủ khi nhận được các truy vấn đồng thời.

4.3.1 Cài đặt MRTG

1. Một số phần mềm cần thiết

Trước khi cài đặt MRTG, chúng ta cần cài đặt một số phần mềm cần thiết khác. Vì giới hạn của tài liệu này, tôi chỉ giới thiệu các phần mềm cần thiết, bạn có thể vào trang chủ của từng phần mềm để xem hướng dẫn chi tiết về cài đặt chúng.

GCC: Bộ biên dịch C chạy trên Unix, bạn có thể tải phần mềm tạihttp://gcc.gnu.org/

Perl: Rất nhiều phần của hệ thống MRTG được viết bằng ngôn ngữ Perl. Bạn có thể tải bộ biên dịch của Perl tại http://www.perl.com/.

Net-SNMP: MRTG sử dụng giao thức SNMP để lấy các thông số về tải hệ thống, phiên đăng nhập, . . . Chúng ta có thể tải Net-SNMP tại http://net-snmp.sourceforge.net/.

Một số tiện ích tạo ảnh: Để tạo ra những bức ảnh PNG, chúng ta cần một số phần mềm hỗ trợ sau:

• gd: là thư viện vẽ đồ họa được tạo bởi Thomas Boutell. Thư viện này sẽ xuất ra định dạng ảnh PNG. Bạn có thể tải về từ địa chỉ http://www.boutell.com/gd/.

• libpng:hỗ trợ gd xuất ra định dạng file PNG. Bạn có thể tải về từ địa chỉ http://www.libpng.org/pub/png/libpng.html.

• zlib: hỗ trợ libpng để nén các file đồ họa được tạo ra. Bạn có thể tải về từ địa chỉ http://www.gzip.org/zlib.

2. Cài đặt MRTG

Để tải MRTG, trong cửa sổ dòng lệnh chúng ta dùng lệnh sau:

wget http://oss.oetiker.ch/mrtg/pub/mrtg-2.17.4.tar.gz

tar xzvf mrtg-2.17.4.tar.gz

Bây giờ chúng ta tiến hành cài đặt MRTG

cd mrtg-2.17.4

./configure –prefix=/usr/local/mrtg-2 make

make install

4.3.2 Cấu hình MRTG

Tạo thư mục để lưu trữ file cấu hình của MRTG

mkdir -p /usr/local/mrtg-2/etc

Tạo thư mục để lưu trữ các file đầu ra của MRTG trong thư mục gốc của Apache

mkdir -p /var/www/mrtg/server

Tạo file bash cachestat.sh,perhitmissMySQL.sh, memcachedstat.sh và

perhitmissMemcached.sh trong thư mục /usr/local/bin để lấy các thông tin cần thiết từ MySQL và memcached. Ví dụ dưới đây sẽ lấy thông tin về cache hit và cache miss của MySQL và memcached:

vi /usr/local/bin/cachestat.sh

#!/bin/sh

echo "SHOW GLOBAL STATUS LIKE ’Qcache_%’" | mysql -uroot -pleduy |awk ’\ $1=="Qcache_hits" {cachehits = $2 }\

$1=="Qcache_not_cached" {cachemiss = $2 }\

END { print cachehits "\n" cachemiss "\n0\n0" }’

vi /usr/local/bin/perhitmissMySQL.sh

#!/bin/sh

echo "SHOW GLOBAL STATUS LIKE ’Qcache_%’" | mysql -uroot -pleduy |awk ’\ $1=="Qcache_hits" {cachehits=$2 }\

$1=="Qcache_not_cached" {cachemiss=$2 }\

END { print cachehits*100/(cachehits+cachemiss) "\n" cachemiss*100/\ (cachehits+cachemiss) "\n0\n0" }’

vi /usr/local/bin/memcachedstat.sh

#!/bin/sh

echo stats | nc 127.0.0.1 11211 |awk ’\ $2=="get_hits" {cachehits = $3 }\

$2=="get_misses" {cachemiss = $3 }\

END { print cachehits "\n" cachemiss "\n0\n0" }’

vi /usr/local/bin/perhitmissMemcached.sh

#!/bin/sh

echo stats | nc 127.0.0.1 11211 |awk ’\ $2=="get_hits" {cachehits = $3 }\

$2=="get_misses" {cachemiss = $3 }\

END { print cachehits*100/(cachehits+cachemiss) "\n" cachemiss*100/\ (cachehits+cachemiss) "\n0\n0" }’

Cấp quyền thực thi cho file vừa tạo:

chmod 755 cachestat.sh

chmod 755 perhitmissMySQL.sh chmod 755 memcachedstat.sh

chmod 755 perhitmissMemcached.sh

Tạo file server-mrtg.cfg với nội dung:

#

# Define global options #

LoadMIBs: /usr/local/share/snmp/mibs/UCD-SNMP-MIB.txt,/usr/local/share /snmp/mibs/TCP-MIB.txt

workdir: /var/www/mrtg/server #

# Query Cache Monitoring #

Title[qcache]: Query Cache

PageTop[qcache]: <H1>Mysql Queries Cache</H1> MaxBytes[qcache]: 100000000000

ShortLegend[qcache]: times YLegend[qcache]: Query Cache LegendI[qcache]: Cache hits LegendO[qcache]: Cache misses Legend1[qcache]: Cache hits Legend2[qcache]: Cache misses

Options[qcache]: gauge,growright,nopercent

#

# Percentage cache hit cache misss MySQL #

Title[hitmisspercent]: Percentage cache hit - cache miss MySQL PageTop[hitmisspercent]: <H1>Percentage Cache Hit Miss MySQL</H1> Target[hitmisspercent]: ‘/usr/local/bin/perhitmissMySQL.sh‘

options[hitmisspercent]: growright,gauge,transparent,nopercent Unscaled[hitmisspercent]: ymwd

MaxBytes[hitmisspercent]: 100

YLegend[hitmisspercent]: Cache hit miss % ShortLegend[hitmisspercent]: %

LegendI[hitmisspercent]: Hits LegendO[hitmisspercent]: Misses

Legend1[hitmisspercent]: Percentage Cache Hits Legend2[hitmisspercent]: Percentage Cache Misses

#

# Memcached Monitoring #

Target[mysql_cache]:‘/usr/local/bin/memcachedstat.sh‘ Title[mysql_cache]: Memcached Status

PageTop[mysql_cache]: <H1>Memcached Status</H1> MaxBytes[mysql_cache]: 1000000

YLegend[mysql_cache]: Query Cache LegendI[mysql_cache]: Memcached hits LegendO[mysql_cache]: Memcached misses Legend1[mysql_cache]: Cache hits

Legend2[mysql_cache]: Cache misses

Options[mysql_cache]: growright,nopercent,gauge

#

# Percentage cache hit cache misss #

Title[hitmissmemcached]: Percentage cache hit - cache miss Memcached PageTop[hitmissmemcached]: <H1>Percentage Cache Hit Miss Memcached</H1> Target[hitmissmemcached]: ‘/usr/local/bin/perhitmissMemcached.sh‘

options[hitmissmemcached]: growright,gauge,transparent,nopercent Unscaled[hitmissmemcached]: ymwd

MaxBytes[hitmissmemcached]: 100

YLegend[hitmissmemcached]: Cache hit miss % ShortLegend[hitmissmemcached]: %

LegendI[hitmissmemcached]: Hits LegendO[hitmissmemcached]: Misses

Legend1[hitmissmemcached]: Percentage Cache Hits Legend2[hitmissmemcached]: Percentage Cache Misses

Cuối cùng, chạy mrtg để sinh ra các file đồ thị

env LANG=C /usr/local/mrtg-2/bin/mrtg /usr/local/mrtg-2/etc /server/server-mrtg.cfg

Bây giờ, các đồ thị đã được sinh ra. Trên thanh địa chỉ trình duyệt, chúng ta vào địa chỉ http://localhost/mrtg/server để xem các ảnh được sinh ra.

Để xem dưới định dạng một trang web, chúng ta sẽ sinh ra file index.html bằng cách dùng công cụ indexmaker được tích hợp trong gói cài của MRTG

indexmaker -title="Memcached and MySQL Status" /usr/local/mrtg-2/etc /server-mrtg.cfg > /var/www/mrtg/server/index.html

sau đây vào cuối file crontab trong thư mục/etc:

*/5 * * * * root env LANG=C /usr/local/mrtg-2/bin/mrtg /usr/local /mrtg-2/etc/server-mrtg.cfg –logging /var/log/mrtg.log

4.4 Đánh giá hiệu năng

4.4.1 Kết quả thống kê từ Memcached và MySQL

Hình4.17 và 4.18 là thống kê về một số trạng thái bộ nhớ Cache của MySQL

Hình 4.17: Thống kê cache hits - cache misses của bộ nhớ Cache MySQL

Hình 4.18: Tỷ lệ phần trăm cache hits - cache misses của bộ nhớ Cache MySQL

Hình 4.19: Thống kê cache hits - cache misses của Memcached

Hình 4.20: Tỷ lệ phần trăm cache hits - cache misses của Memcached 4.4.2 Kết quả thời gian phản hồi sử dụng công cụ ab

Chúng ta sẽ sử dụng công cụ ab của hệ thống Linux để gửi 100 yêu cầu theo từng nhóm 10 yêu cầu đồng thời tới máy chủ là một trang web mà chúng ta đã xây dựng. Chúng ta chạy lệnh ab để gửi yêu cầu tới một trang web trên website đã xây dựng. Ví dụ:

ab -n 100 -c 10 http://localhost/drupal/?q=node/610

Chúng ta nhận được các phản hồi như sau:

• Trường hợp sử dụng đồng thời Memcached và Query Cache MySQL

Server Software: Apache/2.2.20

Server Hostname: localhost

Server Port: 80

Document Path: /drupal/?q=node/610

Concurrency Level: 10

Time taken for tests: 8.877 seconds

Complete requests: 100

Failed requests: 0

Write errors: 0

Total transferred: 2653200 bytes

HTML transferred: 2599800 bytes

Requests per second: 11.26 [#/sec] (mean)

Time per request: 887.730 [ms] (mean)

Time per request: 88.773 [ms] (mean, across all concurrent requests)

Transfer rate: 291.87 [Kbytes/sec] received

Connection Times (ms)

min mean[+/-sd] median max

Connect: 0 1 2.4 0 10

Processing: 484 869 149.9 860 1172

Waiting: 456 794 138.4 795 1109

Total: 484 870 150.3 860 1183

Percentage of the requests served within a certain time (ms)

50% 860 66% 933 75% 975 80% 1005 90% 1072 95% 1144 98% 1157 99% 1183 100% 1183 (longest request) • Trường hợp sử dụng mình Memcached

Server Software: Apache/2.2.20

Server Hostname: localhost

Document Path: /drupal/?q=node/610

Document Length: 25998 bytes

Concurrency Level: 10

Time taken for tests: 9.109 seconds

Complete requests: 100

Failed requests: 0

Write errors: 0

Total transferred: 2653200 bytes

HTML transferred: 2599800 bytes

Requests per second: 10.98 [#/sec] (mean)

Time per request: 910.921 [ms] (mean)

Time per request: 91.092 [ms] (mean, across all concurrent requests)

Transfer rate: 284.44 [Kbytes/sec] received

Connection Times (ms)

min mean[+/-sd] median max

Connect: 0 0 0.9 0 4

Processing: 507 894 162.2 913 1273

Waiting: 418 816 156.6 834 1134

Total: 508 895 162.4 913 1273

Percentage of the requests served within a certain time (ms)

50% 913 66% 964 75% 1022 80% 1044 90% 1106 95% 1138 98% 1227 99% 1273 100% 1273 (longest request)

Server Software: Apache/2.2.20

Server Hostname: localhost

Server Port: 80

Document Path: /drupal/?q=node/610

Document Length: 26497 bytes

Concurrency Level: 10

Time taken for tests: 17.467 seconds

Complete requests: 100

Failed requests: 0

Write errors: 0

Total transferred: 2703100 bytes

HTML transferred: 2649700 bytes

Requests per second: 5.73 [#/sec] (mean)

Time per request: 1746.669 [ms] (mean)

Time per request: 174.667 [ms] (mean, across all concurrent requests)

Transfer rate: 151.13 [Kbytes/sec] received

Connection Times (ms)

min mean[+/-sd] median max

Connect: 0 0 0.6 0 2

Processing: 933 1696 295.6 1689 2692

Waiting: 790 1454 274.2 1460 2501

Total: 933 1696 295.7 1689 2694

Percentage of the requests served within a certain time (ms)

50% 1689 66% 1811 75% 1904 80% 1940 90% 2073 95% 2135 98% 2314 99% 2694

100% 2694 (longest request)

• Trường hợp không sử dụng Memcached và Query Cache MySQL

Server Software: Apache/2.2.20

Server Hostname: localhost

Server Port: 80

Document Path: /drupal/?q=node/610

Document Length: 26497 bytes

Concurrency Level: 10

Time taken for tests: 18.102 seconds

Complete requests: 100

Failed requests: 0

Write errors: 0

Total transferred: 2703100 bytes

HTML transferred: 2649700 bytes

Requests per second: 5.52 [#/sec] (mean)

Time per request: 1810.151 [ms] (mean)

Time per request: 181.015 [ms] (mean, across all concurrent requests)

Transfer rate: 145.83 [Kbytes/sec] received

Connection Times (ms)

min mean[+/-sd] median max

Connect: 0 1 3.7 0 15

Processing: 1139 1746 295.0 1742 2492

Waiting: 824 1481 273.4 1477 2241

Total: 1139 1747 295.2 1743 2507

Percentage of the requests served within a certain time (ms)

50% 1743

66% 1828

75% 1907

90% 2189

95% 2299

98% 2434

99% 2507

100% 2507 (longest request)

Khi đo bằng công cụ ab, kết quả thời gian phản hồi trung bình của các trường hợp được thống kê như hình 4.21

Hình 4.21: Biểu đồ kết quả thống kê thời gian phản hồi trung bình

Qua các số liệu thống kê, chúng ta có kết quả như sau:

• Tỷ lệ phần trăm cache hits trung bình đạt hơn 90%.

• Trường hợp sử dụng cả Memcached và Query Cache MySQL: thời gian phản hồi trung bình của mỗi yêu cầu thấp nhất trong bốn trường hợp là 887.730 ms/request.

• Trường hợp chỉ sử dụng Memcached: thời gian phản hồi trung bình của mỗi yêu cầu là 910.921 ms/request.

• Trường hợp chỉ sử dụng Query Cache MySQL: thời gian phản hồi trung bình của mỗi yêu cầu là 1746.669 ms/request.

• Trường hợp không sử dụng cả Memcached và Query Cache MySQL: thời gian phản hồi trung bình của mỗi yêu cầu cao nhất trong bốn trường hợp là 1810.151 ms/request.

Kết quả trên hoàn toàn đúng với lý thuyết và khẳng định được phương pháp đề xuất là đúng đắn và có thể triển khai thực tế.

Kết luận

Sử dụng bộ nhớ Cache là một việc làm cần thiết đối với bất cứ một hệ thống cơ sở dữ liệu lớn nào. Memcached là một công cụ rất tốt giúp nâng cao hiệu năng truy vấn tới cơ sở dữ liệu, tránh được tình trạng tắc nghẽn khi có quá nhiều truy vấn cùng lúc và giảm tải cho server. Hiện nay, trên thế giới memcached được rất nhiều các hệ thống cơ sở dữ liệu lớn sử dụng bao gồm những trang chia sẽ lớn nhất thế giới như Facebook, YouTube, Twitter, Wikipedia . . .

Qua nghiên cứu đã cho thấy rằng, memcached rất phù hợp để năng cao hiệu năng truy xuất và rút ngắn thời gian phản hồi đối với những trang mạng xã hội, nhưng trang tin tức lớn - những ứng dụng web thường đọc nhiều hơn ghi. Qua các kết quả thực nghiệm đạt được cho thấy phương pháp đề xuất là hoàn toàn khả thi và có thể áp dụng trong thực tế được.

Về mặt nội dung, khóa luận đã đạt được những kết quả sau:

• Giới thiệu một cách tổng quan và sự cần thiết của phương pháp sử dựng bộ nhớ Cache trong bài toán cải thiện hiệu xuất của những hệ thống cơ sở dữ liệu lớn.

• Xây dựng và triển khai thành công một hệ thống memcached đơn giản.

• Xây dựng được một ứng dụng thử nghiệm là một trang web tin tức tích hợp với sử dụng memcached và query cache của MySQL.

Hướng nghiên cứu tiếp theo

• Đi sâu vào nghiên cứu những thiết lập khác của memcached như tính bảo mật, tránh trường hợp nhiều client cập nhật một NVP cùng lúc hay tối ưu hóa thời gian hết hạn cho một dữ liệu được lưu . . .

• Sử dụng memcached kết hợp với một số phương pháp nâng cao hiệu năng hệ thống khác như Replication của MySQL, Cache Proxy Server . . .

Do giới hạn về thời gian và kiến thức nên khóa luận mới chỉ dừng lại ở mức giới thiệu tổng quan về phương pháp và hướng triển khai, cần được tiếp tục nghiên cứu và cải tiến để khẳng định tính hiệu quả của phương pháp.

Tài liệu tham khảo

[1] Baron Schwartz, Peter Zaitsev, Vadim Tkachenko,Jeremy D. Zawodny, Arjen Lentz, and Derek J. Balling,High Performance MySQL, O’Reilly Media, Inc., 1005 Gravenstein Highway North, Sebastopol, CA 95472, Second Edition, June 2008, pp. 164, 204-216, 463-469, 561-562.

[2] Bivas Das and Eric Freudenthal, "Reliable and fault tolerant distributed caching using memcached", 7th Joint NMSU/UTEP Workshop on Mathemat- ics, Computer Science, and Computational Sciences, March 20, 2010.

[3] Brad Fitzpatrick, "Distribued caching with memcached". Linux Journal, Vol 2004 Issue 124, August 2004, pp. 5.

[4] Charles Bell, Mats Kindahl, and Lars Thalmann, MySQL High Availability, O’Reilly Media, Inc., 1005 Gravenstein Highway North, Sebastopol, CA 95472, First Edition, July 2010, pp. 292-318.

[5] H. K. Mehta, P. Kanungo, M. Chandwani, "Distributed database caching for web applications and web services", Proceeding ICWET ´11 Proceedings of the International Conference & Workshop on Emerging Trends in Technology, 2011, pp. 510-515.

[6] Ivan Voras, Danko Basch and Mario ˇZagar, "A High Performance Memory Database for Web Application Caches", Electrotechnical Conference, 2008. MELECON 2008. The 14th IEEE Mediterranean, May,2008, pp. 163 - 168. [7] Jithin Jose, Hari Subramoni, Miao Luo, Minjia Zhang, Jian Huang, Md. Wasi-

ur-Rahman, Nusrat S. Islam, Xiangyong Ouyang, Hao Wang, Sayantan Sur, Dhabaleswar K. Panda, "Memcached Design on High Performance RDMA Capable Interconnects", Proceeding ICPP ’11 Proceedings of the 2011 Inter- national Conference on Parallel Processing, September, 2011, pp. 743 - 752.

[8] Josef Finsel, Using Memcached, Pragmatic Bookshelf at http://pragprog.com/book/memcd/using-memcached, 2008, pp. 1-30, 58- 65.

[9] Qiong Luo, Sailesh Krishnamurthy, C. Mohan, Hamid Pirahesh, Honguk Woo, Bruce G. Lindsay, Jeffrey F. Naughton, "Middle-Tier Database Caching for e-Business",Proceeding SIGMOD ’02 Proceedings of the 2002 ACM SIGMOD international conference on Management of data, pp. 600-611.

[10] Patrick Galbraith, Developing Web Applications with Perl, memcached, MySQL and Apache, JWiley Publishing, Inc. 10475 Crosspoint Boule, 2009, pp. 347-392.

[11] Sara Bouchenak, Alan Cox, Steven Dropsho, Sumit Mittal, Willy Zwaenepoel, "Caching Dynamic Web Content: Designing and Analysing an Aspect- Oriented Solution", Proceeding Middleware’06 Proceedings of the 7th ACM/IFIP/USENIX international conference on Middleware, 2006, pp. 1-21. [12] Sheeri K. Cabral and Keith Murphy MySQL Administrator’s Bible, Wiley Publishing, Inc. 10475 Crosspoint Boulevard Indianapolis, IN 46256, 2009, pp. 423-438.

[13] Trevor James, TJ Holowaychuk, Drupal 6 Performance Tips, ackt Publishing Ltd. 32 Lincoln Road Olton Birmingham, B27 6PA, UK, pp. 169-182.

[14] Vikram Vaswani, MySQL: The Complete Reference, The McGraw-Hill Com- panies, Inc. (“McGrawHill”), 2004, pp. 371-388.

[15] http://dev.mysql.com/doc/refman/4.1/en/query-cache.html

[16] http://docs.oracle.com/cd/A97336_01/cache.102/a88706/ic_intro.htm [17] http://memcached.org/

Một phần của tài liệu NGHIÊN CỨU ẢNH HƯỞNG CỦA CACHING ĐẾN HIỆU NĂNG TRUY VẤN CỦA CÁC ỨNG DỤNG WEB (Trang 50 - 67)