Điểm:1

maxConnections hoặc maxThreads trên tomcat

lá cờ tk

Tìm kiếm lời khuyên - Tôi đã đọc hai chủ đề khác về điều này

trong tệp server.xml của tôi, tôi có hai vị trí trong đó maxThreads được xác định ở hai vị trí:

  1. <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="100" minSpareThreads="4"/>

  1. <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="100" SSLEnabled="true" scheme="https" secure="true" connectionTimeout="600000" keystoreFile="/usr/local/tomcat/conf/keystore.p12" keystorePass="mypassword" clientAuth="false" sslProtocol="TLS" />

Lỗi chúng tôi thường xuyên gặp phải với máy chủ của mình là: "Hết giờ: Nhóm trống. Không thể tìm nạp kết nối sau 30 giây, không có kết nối nào [size:100;busy:100;idle:0;lastwait:30000]" trước khi hệ thống bị tắt nghiêm trọng (máy đặt lại và khởi động lại - trên cụm AWS ECS)

Khi tôi tăng giá trị maxThreads lên 300 trong trường hợp thứ hai được liệt kê ở đây, chúng tôi nhận được thông báo lỗi tương tự - vì vậy tôi không chắc liệu kích thước kết nối có tăng lên hay không. Hành vi của hệ thống khác (máy không khởi động lại) nhưng sau đó người dùng không thể kết nối - cuối cùng nó cần khởi động lại thủ công.

Làm cách nào tôi có thể đạt được nhiều kết nối hơn với hệ thống hoặc giữ kết nối ở mức cao nhất có thể?

Trong các bài đăng khác về chủ đề này, một số đề xuất cũng giảm maxThreads (giả sử chúng hoàn thành nhanh chóng) có thể mang lại hiệu suất tốt hơn.

CẬP NHẬT:

trong tệp thuộc tính ứng dụng của tôi, tôi có các cài đặt sau:

spring.datasource.url=jdbc:postgresql://db####
spring.datasource.username=#####
spring.datasource.password=######
spring.datasource.tomcat.max-wait=10000
spring.datasource.tomcat.max-active=60
spring.datasource.tomcat.test-on-borrow=true

spring.jpa.show-sql=false
#spring.jpa.hibernate.ddl-auto=create-drop
#spring.jpa.hibernate.ddl-auto=validate
spring.jpa.properties.hibernate.show_sql=false
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect

spring.jpa.hibernate.connection.provider_class=org.hibernate.c3p0.internal.C3P0ConnectionProvider
spring.jpa.properties.hibernate.c3p0.min_size=1
spring.jpa.properties.hibernate.c3p0.max_size=30
spring.jpa.properties.hibernate.c3p0.timeout=120
spring.jpa.properties.hibernate.c3p0.max_statements=20
Piotr P. Karwasz avatar
lá cờ by
Những tin nhắn đó không được gửi bởi nhóm luồng đang hoạt động của Tomcat mà bởi nhóm kết nối cơ sở dữ liệu của bạn. Bạn có thể thêm cấu hình nhóm kết nối DB của mình không?
RebRy avatar
lá cờ tk
Cảm ơn phản hồi của bạn Piotr - trong cơ sở dữ liệu của tôi, tôi đã kiểm tra tệp cấu hình (postgres) và maxConnections được đặt thành 500. Các cài đặt có được xác định ở phía máy chủ postgres không?
Piotr P. Karwasz avatar
lá cờ by
Ứng dụng của bạn có thể sử dụng nhóm kết nối (Tomcat JDBC, DBCP2, HikariCP để đặt tên cho một số khả năng). Mỗi người trong số họ được cấu hình theo một cách khác nhau. Bằng cách [tìm kiếm thông báo lỗi của bạn](https://www.google.com/search?q=size%3A100%3Bbusy%3A100%3Bidle%3A0%3Blastwait%3A30000), người ta có thể đoán rằng bạn đang sử dụng Tomcat JDBC. Làm theo [tài liệu](https://tomcat.apache.org/tomcat-9.0-doc/jdbc-pool.html) để tăng `maxActive` (theo mặc định là 100).
RebRy avatar
lá cờ tk
Có - sử dụng Tomcat JDBC - vì tôi chưa quen với điều này nên tôi không thể tìm ra nơi nào khác để tìm các cài đặt này. Điều này đã giúp ích rất nhiều - cảm ơn vì đã đăng các liên kết!
Piotr P. Karwasz avatar
lá cờ by
BTW: nếu bạn có 100 luồng đang hoạt động và 100 kết nối cơ sở dữ liệu trong nhóm, ứng dụng của bạn có thể bị rò rỉ kết nối (tức là không đưa chúng trở lại nhóm). Bạn có thể thử sử dụng các thuộc tính `logAbandoned` và `removeAbandoned` của nhóm để tìm chúng.
RebRy avatar
lá cờ tk
Tôi đã cập nhật tại đây để hiển thị các thuộc tính ứng dụng (mà tôi nghĩ là xác định/mặc định cho các giá trị mà tôi gặp phải lỗi). Tôi chưa có cơ hội thử nghiệm trong sản xuất.
Điểm:1
lá cờ by

Ứng dụng của bạn bị cạn kiệt nhóm kết nối cơ sở dữ liệu: vì bạn có nhiều luồng hoạt động trong Tomcat (100) hơn các kết nối khả dụng trong nhóm kết nối (60), nên nhiều luồng cần đợi kết nối khả dụng. Bạn nên có ít nhất nhiều kết nối tới cơ sở dữ liệu bằng với số luồng đang hoạt động của bạn. Hãy thử với:

spring.datasource.tomcat.max-active=200

Nhận xét: Kể từ khi bạn <Connector> không có một người thừa hành thuộc tính, các <Executor> bạn đã tạo không được sử dụng và có thể bị xóa (trừ khi một trình kết nối khác sử dụng nó).

Vì không có spring.jpa.hibernate.connection.provider_class nhóm kết nối C3P0 mà bạn cố gắng định cấu hình sẽ không bao giờ được tạo: Hibernate sẽ sử dụng nhóm được định cấu hình thông qua spring.datasource.* tính chất. Do đó, bạn có thể xóa các thuộc tính liên quan đến C3P0.

RebRy avatar
lá cờ tk
Thật không may - với những thay đổi này, dịch vụ vẫn gặp lỗi tương tự "Hết thời gian chờ: Nhóm trống. Không thể tìm nạp kết nối sau 30 giây, không có kết nối nào[size:100; busy:100; idle:0; lastwait:30000]." (Tôi đã thêm maxConnections=300 vào
Piotr P. Karwasz avatar
lá cờ by
Vì nhóm kết nối dường như không thay đổi sau khi cấu hình lại, nên có thể ứng dụng của bạn không sử dụng nhóm kết nối của Spring mà là một ứng dụng khác. Kiểm tra nếu bạn không có `` định nghĩa của loại `javax.sql.DataSource` trong thư mục `conf` Tomcat của bạn (nó có thể nằm trong nhiều tệp khác nhau).
RebRy avatar
lá cờ tk
Tôi đang xem lại vấn đề này một lần nữa (vì chúng tôi đã xoay sở để giải quyết vấn đề này) và đang xem lại khả năng điều chỉnh cài đặt của mình và đã bỏ sót một chi tiết trong nhận xét của bạn -- Tôi đã thấy một số mã bị nhận xét trong server.xml của chúng tôi: . việc bỏ ghi chú những dòng này có sử dụng trình thực thi được xác định trước đó trong tệp server.xml không? Có cách nào để lặp lại/in/ghi nhật ký các loại thuộc tính/cấu hình này trong nhật ký khởi động java/tomcat không?

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.