Một ứng dụng có thể hoạt động rất tốt trong môi trường phát triển, tuy nhiên sau khi triển khai vào môi trường thực tế (production environment), ứng dụng hoạt động ngày càng kém đi do có sự gia tăng của tải trọng (số lượng người dùng hoặc lượng dữ liệu tăng lên). Chính vì vậy, việc đánh giá tình trạng cũng như thực hiện các giải pháp cải tiến hiệu năng là rất quan trọng không chỉ trong quá trình phát triển mà còn trong toàn bộ vòng đời của ứng dụng.

Hiệu năng của ứng dụng là gì?

Hiệu năng của ứng dụng, là tính chất thể hiện mức độ hiệu quả trong việc thực thi mã lệnh của ứng dụng, được đặc trưng bởi số lượng công việc mà ứng dụng thực hiện được trong một khoảng thời gian và với một lượng tài nguyên máy tính xác định. Hiệu năng của ứng dụng được đánh giá thông qua một số các khía cạnh đặc trưng sau:

  • Vùng phủ bộ nhớ (Memory Footprint): là lượng bộ nhớ được sử dụng bởi ứng dụng (kể cả máy ảo Java (JVM) mà ứng dụng chạy trên đó). Trong ứng dụng Java, cần chú ý tình huống khi vùng phủ bộ nhớ tăng lên có tác động đến bộ nhớ ảo (Virtual Memory) không? Việc hoán đổi dữ liệu giữa bộ nhớ ảo và bộ nhớ vật lý (RAM) cần được hạn chế tối đa trong các ứng dụng Java. Thử hình dung trường hợp bộ thu dọn rác (Garbage Collector) thu hồi một khối lớn vùng nhớ heap đang nằm trong bộ nhớ ảo, việc quét xem các đối tượng có còn được tham chiếu hay không sẽ mất nhiều thời gian hơn rất nhiều so với trường hợp vùng nhớ heap đang nằm trong bộ nhớ vật lý.
  • Thời gian kích hoạt (Startup Time): là khoảng thời gian cần thiết để ứng dụng khởi động. Thời gian kích hoạt đối với các ứng dụng Client thường phải ngắn, càng ngắn càng tốt, điều này rất quan trọng do sự tác động trực tiếp đến tâm lý người sử dụng. Ngược lại, đối với các ứng dụng Server thời gian kích hoạt ít quan trọng hơn.
  • Khả năng mở rộng (Scalability): là mức độ ứng dụng vẫn còn đáp ứng tốt khi có sự gia tăng về tải trọng sử dụng (do số người dùng hoặc lượng dữ liệu tăng lên). Nếu thời gian phản hồi của ứng dụng tăng theo cấp số mũ của tải trọng, khi đó ta nói ứng dụng có khả năng mở rộng kém. Ngược lại, nếu thời gian phản hồi của ứng dụng tăng theo mức độ tuyến tính đối với tại trọng, khi đó ta nói ứng dụng có khả năng mở rộng tốt.
  • Khả năng sẵn sàng đáp ứng (Responsiveness): thể hiện ở mức độ nhanh chóng của ứng dụng trong việc phản hồi một yêu cầu dữ liệu.
  • Thông lượng (Throughput): của một ứng dụng là lượng tối đa công việc mà ứng dụng xử lý được trong một khoảng thời gian xác định.

Đây là các khía cạnh đặc trưng cho hiệu năng ứng dụng nói chung. Riêng với các ứng dụng Java, chúng ta tập trung nhiều hơn vào việc tối ưu hóa JVM để tăng khả năng sẵn sàng đáp ứngthông lượng. Để làm được điều này, chúng ta cần phát hiện, xử lý, điều chỉnh các vấn đề hiệu năng nảy sinh trong ứng dụng Java. Các ứng dụng Java thường gặp phải các vấn đề hiệu năng thuộc các loại sau:

  • Rò rỉ bộ nhớ (Memory Leaks): là những tình huống xảy ra khi có các đối tượng hết sử dụng, không còn tham chiếu trỏ đến nhưng vẫn tồn tại trong bộ nhớ mà không bị thu dọn rác (Garbage Collector) thu hồi.
  • Cạnh tranh khóa (Lock contention): tình trạng xảy ra khi một thread cố giành lấy khóa (lock) đang bị chiếm giữ bởi một thread khác. Nếu càng nhiều thread phải dừng lại chờ trong thời gian kéo dài sẽ làm giảm hiệu năng của ứng dụng. Thiết lập cơ chế quản lý khóa càng mịn, thì tình trạng thread phải chờ để nhận khóa từ tiến trình khác càng ít xảy ra.
  • Điều chỉnh kích cỡ vùng nhớ heap (Tuning heap size): kích cỡ vùng nhớ heap ảnh hưởng đến vấn đề hoán đổi dữ liệu giữa bộ nhớ ảo và bộ nhớ vật lý. Dành quá ít hoặc quá nhiều bộ nhớ cho vùng nhớ heap đều ảnh hưởng đến hiệu năng của ứng dụng.
  • Tối ưu hóa thu gom rác trong JVM (Optimizing JVM garbage collection): việc hiểu rõ cơ chế vận hành của bộ thu gom rác (Garbage Collector) và điều chỉnh cho phù hợp với đặc điểm của ứng dụng sẽ giúp cải thiện rất lớn đến hiệu năng của ứng dụng.

Quá trình cải tiến hiệu năng

Cải tiến hiệu năng là quá trình thu thập thông tin về hiệu năng của ứng dụng, phân tích xác định nguyên nhân ảnh hưởng đến hiệu năng, từ đó chỉnh sửa mã nguồn hoặc điều chỉnh thông số của phần mềm để làm tăng hiệu năng của ứng dụng, đáp ứng được yêu cầu đưa ra. Quá trình cải tiến hiệu năng được thực hiện thông qua 3 hoạt động: Theo dõi hiệu năng1 (Performance monitoring), Đo đạc hiệu năng2 (Performance profiling) và Điều chỉnh hiệu năng (Performance tuning).

Chu trình cải tiến hiệu năng cho ứng dụng Java

Theo dõi hiệu năng

Theo dõi hiệu năng là một hành động quan sát và thu thập - một cách không can thiệp (nonintrusive) - dữ liệu hiệu năng từ một ứng dụng đang vận hành. Trong hầu hết các trường hợp, theo dõi thường là dạng hành động mang tính phòng ngừa và chủ động, được thực hiện trong tất cả các môi trường của ứng dụng: môi trường thực, môi trường giám định chất lượng, hoặc môi trường phát triển. Tuy nhiên, theo dõi cũng thường là bước đầu tiên trong các hành động phản ứng lại tình huống xuất hiện báo cáo có vấn đề về hiệu năng của ứng dụng từ người dùng hoặc những người có liên quan, nhưng không cung cấp đầy đủ thông tin hoặc những đầu mối đề tìm ra nguyên nhân gốc rễ vấn đề. Theo dõi giúp xác định và cách ly các vấn đề tiềm năng mà không ảnh hưởng nghiêm trọng đến sự sẵn sàng đáp ứng hoặc thông lượng của một ứng dụng hiện đang chạy.

So sánh giữa Performance Monitoring với chẩn đoán lâm sàng

Theo dõi hiệu năng tương tự như quá trình chẩn đoán bệnh trong y học: bác sỹ thực hiện các kiểm tra sơ bộ, đo các chỉ số sinh hiệu (huyết áp, nhịp tim, v.v.), tác động cơ học lên cơ thể bệnh nhân, yêu cầu bệnh nhân mô tả các triệu chứng, từ đó chẩn đoán và khoanh vùng các nghi vấn về tình trạng bệnh tật. Việc khám bệnh có thể được thực hiện theo định kỳ để phòng ngừa, trong môi trường sinh hoạt bệnh nhân (bác sỹ đến khám tại nhà) hoặc bệnh nhân tự đến gặp bác sỹ để yêu cầu được khám bệnh khi phát hiện có triệu chứng bị ốm.

Đo đạc hiệu năng

Đo đạc hiệu năng cũng là một hành động thu thập dữ liệu hiệu năng từ một ứng dụng đang vận hành. Tuy nhiên, khác với theo dõi hiệu năng, việc lập hồ sơ hiệu năng có thể tác động hoặc can thiệp nhiều hơn đến ứng dụng. Đo đạc hiệu năng thường tập trung có chủ đích vào phạm vi hẹp hơn so với theo dõi hiệu năng. Đo đạc rất hiếm khi được thực hiện trong môi trường thực, mà nó thường được thực hiện trong các môi trường giám định chất lượng, kiểm thử hoặc phát triển. Đo đạc thường chỉ xảy ra sau hoạt động theo dõi kết thúc hoặc khi những yêu cầu về hiệu năng được xác định rõ (well-defined).

So sánh giữa Performance Profiling với xét nghiệm cận lâm sàng

Chúng ta có thể hình dung việc lập hồ sơ hiệu năng giống như quá trình xét nghiệm cận lâm sàng trong y học: sau khi đã chẩn đoán thông qua các triệu chứng lâm sàng, bác sỹ sẽ khoanh vùng căn bệnh và yêu cầu bệnh nhân thực hiện các xét nghiệm sâu hơn và cụ thể hơn. Ví dụ, sau khi khám và nghe mô tả của bệnh nhân: đau và hạn chế vận động cột sống, bả vai, ái phát từng đợt, thường sau khi vận động nhiều, bác sỹ chẩn đoán bệnh nhân bị loãng xương. Để xác định chính xác và chắc chắn hơn, bác sỹ sẽ chỉ định xét nghiệm cận lâm sàng: chụp X-Quang và đo chỉ số T-score. Với các thông tin thu được, bác sỹ có thể xác định nguyên nhân và đưa ra phát đồ điều trị bệnh.

Điều chỉnh hiệu năng

Điều chỉnh hiệu năng là hoạt động chỉnh sửa mã nguồn hoặc thông số cấu hình của ứng dụng nhằm mục đích tăng cường khả năng sẵn sàng đáp ứng và nâng cao thông lượng của ứng dụng. Điều chỉnh hiệu năng thường được thực hiện sau các bước theo dõi hiệu năng và lập hồ sơ hiệu năng.

So sánh giữa Performance Tuning với điều trị bệnh

Tương ứng trong y tế, đây là quá trình bác sỹ áp dụng các phác đồ điều trị cũng như những cán thiệp y học (phẫu thuật, tiêm/uống thuốc, vật lý trị liệu, v.v.) để khắc phục các nguyên nhân gây bệnh, từ đó phục hồi và tăng cường sức khỏe cho người bệnh.

Kết luận

Bài viết này3 trình bày khái niệm về hiệu năng của ứng dụng, các khía cạnh đặc trưng và các vấn đề liên quan đến hiệu năng trong ứng dụng Java. Bài viết cũng trình bày sơ lược 3 bước của quá trình cải tiến hiệu năng: theo dõi, đo đạc và hiệu chỉnh.

  1. Từ monitoring có thể dịch thành các từ giám sát, quan sát, theo dõi. Tôi chọn từ theo dõi.

  2. Các bạn có thể tra từ điển từ profiling có nghĩa lập hồ sơ, định hình. Ở đây tôi dịch là đo đạc vì cảm thấy từ này hợp nghĩa nhất.

  3. Bài viết này là bài mở đầu cho loạt bài viết về cải tiến hiệu năng cho ứng dụng Java (Java Performance).

Comments