2009-04-24 36 views
5

Tôi có một ứng dụng Java mã nguồn mở sử dụng Hibernate và HSQLDB để lưu giữ lâu bền. Trong tất cả các bài kiểm tra đồ chơi của tôi, mọi thứ chạy nhanh và mọi thứ đều tốt. Tôi có một khách hàng đã chạy phần mềm trong vài tháng liên tục và cơ sở dữ liệu của họ đã phát triển đáng kể trong thời gian đó, và hiệu suất đã giảm dần. Nó cuối cùng đã xảy ra với tôi rằng cơ sở dữ liệu có thể là vấn đề. Theo như tôi có thể nói từ báo cáo tường trình, tất cả các tính toán trong máy chủ xảy ra nhanh chóng, vì vậy điều này phù hợp với giả thuyết rằng DB có thể bị lỗi.Cách điều chỉnh hiệu suất của ứng dụng hsqldb/hibernate

Tôi biết cách làm hồ sơ bình thường của chương trình để tìm ra nơi có điểm nóng và những gì đang chiếm một lượng đáng kể thời gian. Nhưng tất cả các profilers tôi biết về thời gian thực hiện giám sát trong chương trình và không cung cấp cho bạn bất kỳ sự trợ giúp nào về các cuộc gọi đến các tài nguyên bên ngoài. Những công cụ nào mọi người sử dụng để lập hồ sơ các chương trình đang sử dụng các cuộc gọi db bên ngoài để tìm ra nơi để tối ưu hóa hiệu suất?

Một chút mù tìm kiếm xung quanh đã tìm thấy một vài điểm nóng - tôi nhận thấy một cuộc gọi nơi tôi đang liệt kê tất cả các đối tượng của một lớp cụ thể để tìm hiểu xem có bất kỳ thứ gì không. Một thay đổi một dòng cho tiêu chí [.setMaxResults (1)] đã thay đổi cuộc gọi đó từ nửa giây đến gần như tức thời. Tôi cũng thấy những nơi mà tôi hỏi cùng một câu hỏi từ db nhiều lần trong một giao dịch duy nhất. Tôi đã không tìm ra cách để cache câu trả lời được nêu ra, nhưng những gì tôi thực sự muốn là một công cụ để giúp tôi tìm kiếm những loại điều một cách hệ thống hơn.

Trả lời

3

Thật không may, theo như tôi biết, không có công cụ cho điều đó.

Nhưng có một số điều bạn có thể muốn kiểm tra:

  • Bạn đang sử dụng tải háo hức thay vì tải lười biếng? Bằng cách mô tả sự cố của bạn, có vẻ như bạn đang không sử dụng tải chậm ...
  • Bạn đã bật và định cấu hình đúng bộ nhớ đệm cấp hai chưa? Bao gồm bộ nhớ cache truy vấn? Cơ chế đệm ẩn hibernate cực kỳ mạnh mẽ và linh hoạt.
  • Bạn có cân nhắc sử dụng Tìm kiếm Hibernate không? Tùy thuộc vào truy vấn của bạn, chỉ mục Tìm kiếm toàn văn Hibernate trên đầu trang của Apache Lucene có thể tăng tốc cho bạn truy vấn (vì hệ thống lập chỉ mục mạnh mẽ như vậy)
+0

Tôi chưa thực hiện bất kỳ điều chỉnh hiệu suất nào trên cấu hình DB. Tôi đã giả định rằng vấn đề của tôi có nhiều khả năng là các truy vấn được hình thành kém hoặc hỏi sai câu hỏi quá nhiều lần. Tôi đoán tôi muốn tìm cách giảm số lượng truy vấn và chi phí của họ trước, và sau đó (sau khi cắt giảm mức sử dụng xuống 80%), hãy tăng tốc độ db bằng cách sử dụng bộ nhớ đệm và các thủ thuật khác để giảm tải. Nhưng tôi không phải là một chuyên gia trong việc điều chỉnh sử dụng DB. Bạn có đề xuất điều chỉnh DB trước khi ứng dụng không? – PanCrit

+0

Nếu bạn chắc chắn rằng sự cố đang ở chế độ ngủ đông, việc điều chỉnh DB sẽ không giúp ích gì. Trước khi điều chỉnh, sử dụng công cụ profiler hoặc một công cụ giúp bạn theo dõi chính xác gốc của các vấn đề về hiệu suất, sau đó tối ưu hóa nó. Thật không may, không có cách nào dễ dàng. Tin tốt là: tất cả các IDE ngày nay có hỗ trợ profiling phong nha. – razenha

0

Bạn đang lưu trữ bao nhiêu dữ liệu trong HSQLDB? Tôi không nghĩ rằng nó hoạt động tốt khi quản lý nhiều tập dữ liệu, vì nó chỉ lưu trữ mọi thứ trong các tệp ...

+0

Tôi không nghĩ rằng nó là rất lớn so với những gì hsqldb có thể làm. Tệp .script dài gần 300K (32891015 ký tự). Tôi đã xem trước đó, và có 3000 Market và 150K giao dịch được lưu trữ trong DB. Có thể là 250K hàng tổng cộng trên tất cả các đối tượng. – PanCrit

0

Có một công cụ gọi là IronGrid/IronEye/IronTrackSql đã thực hiện chính xác những gì bạn đang tìm kiếm. Thật không may, họ đã đi ra khỏi kinh doanh. Họ đã mở nguồn sản phẩm của họ vào phút cuối, nhưng tôi đã không thể tìm thấy nguồn hoặc nhị phân trong một thời gian.

Tôi đã sử dụng YourKit để định cấu hình gần đây, một phần vì bạn có thể có hồ sơ SQL thời gian để tìm các câu lệnh được gọi nhiều nhất và các câu lệnh chạy dài nhất. Nó không phải là chi tiết như IronGrid được, nhưng nó cung cấp cho bạn thông tin có giá trị. Trong cơ sở dữ liệu mới nhất của tôi/phiên điều chỉnh hibernate, vấn đề hóa ra là ngủ đông và làm thế nào và khi nó đã làm háo hức so với tải lười biếng, và thêm một số ghi đè khôn ngoan của mặc định khi chọn số lượng lớn các mặt hàng.

0

Rất nhiều báo cáo tại đây. Tôi có một số kết quả, và vẫn đang tìm câu trả lời tốt.

Tôi đã tìm thấy một vài công cụ có thể trợ giúp:

VisualVM (với BTrace, hoặc xây dựng vào vết) tuyên bố để giúp truy tìm, nhưng tôi đã không thể tìm thấy bất kỳ công cụ cho thấy thời gian trên các cuộc gọi phương thức.

YourKit được cho là hữu ích; Tôi đã yêu cầu giấy phép nguồn mở.

Điều hữu ích nhất tôi thấy là số liệu thống kê được tích hợp trong Hibernate. Nếu bạn đặt hibernate.generate_statistics true trong thuộc tính của mình, bạn có thể gửi sessionFactory.getStatistics() và xem thống kê chi tiết về những đối tượng nào đã được lưu trữ và truy xuất và những gì ảnh hưởng đến bộ nhớ cache đang có. Tôi tìm thấy một trong những câu trả lời tôi muốn trong qeuryStatistics, báo cáo cho mỗi truy vấn được biên dịch, số lần truy cập bộ nhớ cache và số lần truy vấn, số lần truy vấn đã chạy, số hàng được trả lại và thời gian thực hiện trung bình, tối đa và tối thiểu. Những thời gian này làm cho nó dồi dào rõ ràng nơi mà thời gian đã đi.

Tôi sau đó đã thực hiện một số đọc về bộ nhớ đệm. Đề xuất của Razenha đã đúng. [Tôi sẽ đánh dấu câu trả lời của anh ấy ngay bây giờ.] Tôi đã thêm hibernate.cache.use_query_cache true vào các thuộc tính của mình và thêm query.setCacheable(true); vào hầu hết các truy vấn của tôi. Tôi cũng đã thêm <cache usage="read-write"/> vào một số tệp .hbm.xml của tôi. Bây giờ hầu hết các số liệu thống kê của tôi đang cho thấy sự chiếm ưu thế lớn trong số lần truy cập bộ nhớ cache và hiệu suất tốt hơn rất nhiều.

Tôi vẫn muốn một số công cụ giúp tôi theo dõi thời gian thực hiện để tôi có thể tấn công những vấn đề tồi tệ nhất thay vì rõ ràng nhất, nhưng đây là một trợ giúp lớn. Có lẽ một trong những công cụ truy tìm ở trên sẽ xuất hiện để trợ giúp.

+0

yourkit rất hữu ích và dễ sử dụng. – PanCrit

0

Trong Terracotta 3.1, bạn có thể theo dõi tất cả các thống kê đó trong thời gian thực bằng Bảng điều khiển dành cho nhà phát triển Terracotta. Bạn có thể xem các biểu đồ lịch sử cho thống kê bộ nhớ cache và xem thống kê hibernate hoặc thống kê bộ nhớ cache toàn cụm hoặc trên cơ sở mỗi nút.

Đất nung là nguồn mở. Thêm chi tiết và tải xuống tại số Terracotta for Hibernate.

Các vấn đề liên quan