header-object

Xdebug Phần 2 - Đi tìm "nút thắt cổ chai" của website

xdebug-p2-1Trong phần 1, tôi đã giới thiệu Xdebug với tính năng dò lỗi trong code PHP, tuy nhiên, Xdebug không chỉ dừng lại ở mỗi tính năng đó. Cái hay của Xdebug đó là nó còn có thể dò ra được “nút thắt cổ chai” (bottle neck) – điểm làm chậm website.

Khi chúng ta thấy được điểm “chậm” thì mới biết cách cải tiến, nâng cấp như thế nào chứ không thể đoán mò và nói rằng “website tôi chạy siêu tốc”, việc gì cũng có chứng cứ và khoa học thì mới có ý nghĩa xác thực. Tính năng này được gọi là profiler website.

 

1. Cấu hình Xdebug với tính năng profiler

Cũng như trong phần 1, chúng ta cần tùy chỉnh một vài thông số để bật tính năng profiler của Xdebug lên vì mặc định nó sẽ không được kích hoạt. (xem lại phần 1 để biết cách cấu hình php.ini đối với WAMP)

  xdebug.profiler_enable = Off
  xdebug.profiler_enable_trigger = On
  xdebug.profiler_output_name = callgrind.out.%t.%p
  xdebug.profiler_output_dir = "d:/wamp/profiler" 

Với cấu hình như bên trên, thì tôi vẫn không kích hoạt thường trú cho tính năng profiler website của Xdebug, mà thay vào đó tôi sẽ kích hoạt nó “bằng tay” khi nào cần. Việc này tiện lợi vì không phải lúc nào mình cũng đi “dò đường” mà chỉ nên dò khi nào cảm nhận chỗ này nó chậm hay cần cải tiến gì đó. Để kích hoạt bằng tay, chỉ cần truyền 1 biến dạng $_GET hoặc $_POST hoặc là cài $_SESSION có giá trị XDEBUG_PROFILE là được.

Việc này tôi nghĩ không quá khó với bất kỳ ai biết lập trình PHP. Ngoài ra thì với cấu hình trên, file profiler sẽ được lưu trong thư mục “D:/wamp/profiler” (mọi người có thể chỉnh thư mục khác tùy ý). Và nhớ là phải tạo thư mục này trước khi chạy profiler.

 

2. Công cụ đọc kết quả profiler

Sau khi profiler website, Xdebug sẽ xuất thành 1 file được lưu trong thư mục đã cấu hình. Chúng ta cần những công cụ để có thể đọc được kết quả này. Tôi giới thiệu một vài công cụ như sau

  • KCacheGrind: đây là công cụ trên hệ Linux/Unix KDE
  • WinCacheGrind: Đây là công cụ trên hệ Windows
  • XCallGraph: Đây là công cụ chạy trên Java
  • Webgrind: Đây là công cụ được tích hợp sẵn trên WAMP

Và tôi sẽ dùng công cụ đơn giản nhất Webgrind để làm minh họa cho bài viết này.

 

3. Demo với đoạn script đơn giản

Bắt đầu với một đoạn script cực kỳ đơn giản như sau:

  $arr = range(1, 1000);
  for($i = 0; $i < count($arr); $i++)
  {
  echo  $arr[$i] . '<br />';
  } 

Và sau đó chúng ta sẽ chạy profiler đoạn script này. Ví dụ mọi người tạo đoạn script bên trên trong tập tin profiler.php và chứa trong thư mục D:/wamp/www (thư mục chạy mặc định web trong WAMP) thì đường link chạy thông thường đó là http://localhost/profiler.php thì giờ chúng ta thêm một biến dạng $_GET vào link như sau để chạy profiler http://localhost/profiler.php?XDEBUG_PROFILE.

Sau đó chúng ta mở Webgrind để xem kết quả này, thông thường khi cài đặt wamp thì nó mặc định có và link vào Webgrind như sau: http://localhost/webgrind.

xdebug-p2-2

Ở đây bạn sẽ thấy hàm count được gọi tới 1001 lần, do nó bị gọi trong vòng lập. Kết quả 1001 lần gọi hàm count này đều có cùng 1 kết quả như nhau, nên chúng ta không việc gì phải phí tới 1000 lần gọi nữa. Chúng ta cải tiến lại đoạn code trên như sau:

  $max = 1000;
    $arr = range(1, $max);
    for($i = 0; $i < $max; $i++)
    {
    echo  $arr[$i] . '<br />';
    }

Và chạy lại profiler lần nữa, chúng ta sẽ có kết quả như sau:

xdebug-p2-3

Bạn sẽ thấy rằng không còn lệnh count nào nữa, vào code chúng ta chạy nhanh hơn rất nhiều dựa vào con số miliseconds bên trên. Đây chỉ là một ví dụ nhỏ mang tính minh họa cho việc dò thắt cổ chai, hy vọng giúp mọi người cải thiện được cách code của mình và tăng hiệu quả website lên.

GV Trần Minh Quang

Thêm ý kiến


Security code
Làm mới


2

Facebook

Thống kê truy cập

Hiện có 765 khách đang truy cập
2491926