2012-06-01 23 views
6

Tôi có một ứng dụng web thường mất nhiều thời gian để triển khai trên Tomcat. Nghi ngờ của tôi là có một kết nối cơ sở dữ liệu ở đâu đó chờ đợi cho đến khi hết thời gian chờ, nhưng đó chỉ là phỏng đoán và tôi muốn tìm hiểu xem điều gì đang gây ra sự cố để tôi có thể khắc phục vấn đề. Bất cứ ai có thể gợi ý một cách tôi có thể đi về việc này? Tôi có nên hồ sơ Tomcat khi nó tải WAR và tìm ở đó cho manh mối? Nếu vậy thì có một hướng dẫn ở đâu đó tốt cho người mới bắt đầu?Làm thế nào tôi có thể tìm hiểu những gì đang thực hiện WAR của tôi quá lâu để triển khai trên Tomcat?

Trong trường hợp này, ứng dụng web của tôi sử dụng Spring và Hibernate. Tôi đã được một đồng nghiệp nói rằng có lẽ những thứ này đang gây chậm lại ở chỗ chúng quá lớn tới mức một nơi nào đó một trình nạp lớp đang nghẹt thở trên số lượng lớn các lớp cần tải.

Ngoài ra tôi thấy điều này khi tôi dừng lại Tomcat hoặc nóng triển khai WAR một Tomcat đang chạy:

Jun 1, 2012 6:03:33 PM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc 
SEVERE: The web application [/nacem-rest] registered the JDBC driver [oracle.jdbc.OracleDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. 
Jun 1, 2012 6:03:34 PM org.apache.catalina.startup.HostConfig deployWAR 

Có lẽ đây là một phần của vấn đề? Việc triển khai lại ứng dụng web của tôi hầu như luôn yêu cầu khởi động lại Tomcat, và tôi luôn cho rằng vấn đề trình điều khiển JDBC đã đề cập ở trên là đáng trách, nhưng có lẽ nó cũng có liên quan đến thời gian bắt đầu chậm chạp?

Tôi biết rất ít về loại điều này vì vậy đây là cơ hội thực sự để tìm hiểu. Cảm ơn trước sự giúp đỡ của bạn.

Trả lời

7

Bạn có thể sử dụng hồ sơ, nhưng đó là một chút quá mức cần thiết. Thay vào đó, chỉ cần tạo một vài luồng trong khi tải ứng dụng. Bạn có thể sử dụng jstack hoặc jvisualvm, nhiều tài nguyên trên mạng mô tả cách thực hiện việc này. Về cơ bản bạn cần một PID của Tomcat của bạn (xem: jps).

Nếu bạn thấy khó phân tích kết xuất chuỗi - hãy thêm nó vào câu hỏi của bạn. Thông thường nó khá dễ dàng để tìm một nút cổ chai. vấn đề tiêu biểu:

  • ứng dụng cố gắng để lấy một số tài nguyên từ Internet như lược đồ XML
  • rất nhiều lớp để quét trên CLASSPATH
  • GC quá mức (kích hoạt tính năng tiết gc khai thác gỗ chỉ trong trường hợp)
  • không đủ bộ nhớ (trao đổi, xem iostat/iotop)
3

Bạn nên dành một vài chủ đề bãi trong triển khai (càng nhiều càng tốt), và phân tích chúng. Tìm các khối, chờ đợi, vv Thread Dump Analyzer có thể được sử dụng.

3

đầu tiên tôi sẽ xem là cách sử dụng CPU hoặc RAM của tomcat thực hiện trong khi khởi động ứng dụng của bạn.

Nếu bạn thấy nhiều hoạt động CPU và RAM tăng, thì có thể tải nhiều thứ, như nhiều lớp hoặc thực hiện một số loại phân bổ trước hoặc tương tự lớn. Trong trường hợp đó bãi chứa thread có thể giúp bạn rất nhiều, nhưng cũng "lsof" (nếu tomcat của bạn đang chạy trên một môi trường * nix) để xem những tập tin nó hiện đang làm việc trên.

Tuy nhiên, nếu bạn thấy nó chỉ đơn giản là ngồi đó, thì có thể nó đang chờ kết nối.

Một nguyên nhân có thể là kết nối DB, như bạn nghĩ. DB thường nhanh chóng trả lời và nỗ lực không kết nối được với DB thường được ghi lại rõ ràng ở đâu đó, nhưng vẫn có thể.

Nguyên nhân khác, ít được biết hơn có thể là một số xác thực XML. Nó không phải là không phổ biến cho một ứng dụng web để tải một số dữ liệu XML, và nó không phải là không phổ biến để sử dụng một trình phân tích cú pháp xác thực để tải XML đó. Trình phân tích cú pháp xác thực cần một lược đồ hoặc DTD để xác nhận hợp lệ và URL cho tệp lược đồ/DTD thường được bao gồm trong XML. Vì vậy, một số trình phân tích cú pháp sẽ cố gắng tải tệp lược đồ từ internet để xác thực XML và có thể mất rất nhiều thời gian để kết nối internet. Hơn nữa, một số trình phân tích cú pháp sẽ không hoạt động âm thầm và đơn giản là không xác thực XML, có thể sau một thời gian chờ khá dài. Xin lỗi vì đã mơ hồ về "một số trình phân tích cú pháp" vv .. nhưng nếu việc tải XML được thực hiện bởi các thư viện được sử dụng bên trong webapp của bạn, họ có thể sử dụng trình phân tích cú pháp XML JVM, mọi phiên bản có thể của Xerces, mọi phiên bản có thể cho JDOM, v.v ... và thậm chí các thư viện khác nhau tồi tệ nhất có thể đang sử dụng các trình phân tích cú pháp khác nhau.

Tuy nhiên, nếu đó là sự cố kết nối, bạn sẽ dễ dàng thấy nó bằng cách sử dụng "netstat -anlp | grep java" (trong tomcat của bạn là môi trường * nix, nếu không nó sẽ là "netstat -ano" trên cửa sổ) và tìm kiếm kết nối gửi đi mà tomcat của bạn đang cố gắng thực hiện. Ở đó bạn có thể thấy các kết nối DB và các kết nối gửi đi (thường là http) để tìm kiếm các lược đồ hoặc các công cụ khác.

4

Nếu bạn đang sử dụng Tomcat 7.0.x, nó có thể đang quét đường dẫn lớp để phát hiện chú thích. Nếu bạn có nhiều lọ/lớp, thì đây có thể là một vấn đề.

Như Simone cho biết, việc lấy và phân tích một vài bãi chứa luồng là một cách hay để bắt đầu.

Nếu bạn không sử dụng phiên bản Tomcat gần đây, hãy thử nâng cấp & kiểm tra tệp conf/catalina.properties để biết các gợi ý về cách giảm số lượng các lọ được quét.

0

Tôi thấy rằng tôi đã có một sự chậm trễ lớn khi triển khai một ứng dụng web cho Tomcat8. Tôi đã có ba hồ bơi kết nối cơ sở dữ liệu được cấu hình trong tệp context.xml của tôi trong WAR. Mỗi nhóm kết nối có số lượng kết nối ban đầu là 10 kết nối, do đó Tomcat đã tạo ra 30 kết nối cơ sở dữ liệu khi khởi động. Tôi thấy rằng việc cấu hình mỗi nhóm cho 1 kết nối ban đầu trên hệ thống thử nghiệm của tôi đã cải thiện thời gian triển khai từ khoảng 3 phút đến 22 giây.

-3

Nối dưới đây trong setenv.sh của tomcat7/bin thư mục làm việc của bạn:

JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"

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