Score:1

maxConnections หรือ maxThreads บน Tomcat

ธง tk

กำลังมองหาคำแนะนำ - ฉันได้อ่านอีกสองหัวข้อเกี่ยวกับเรื่องนี้

ในไฟล์ server.xml ของฉัน ฉันมีสองตำแหน่งที่กำหนด maxThreads ในสองแห่ง:

  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" />

ข้อผิดพลาดที่เราพบบ่อยกับเซิร์ฟเวอร์ของเราคือ: "หมดเวลา: พูลว่างเปล่า ไม่สามารถเรียกการเชื่อมต่อใน 30 วินาที ไม่มี [size:100;busy:100;idle:0;lastwait:30000]" ก่อนการปิดระบบอย่างร้ายแรง (เครื่องจะรีเซ็ตและเริ่มต้นใหม่อีกครั้ง - บนคลัสเตอร์ AWS ECS)

เมื่อฉันเพิ่มค่า maxThreads เป็น 300 ในตัวอย่างที่สองที่แสดงไว้ที่นี่ เราได้รับข้อความแสดงข้อผิดพลาดเดียวกัน ดังนั้นฉันจึงไม่แน่ใจว่าขนาดการเชื่อมต่อเพิ่มขึ้นเลยหรือไม่ ลักษณะการทำงานของระบบแตกต่างออกไป (เครื่องไม่รีสตาร์ท) แต่จากนั้นผู้ใช้ไม่สามารถเชื่อมต่อได้ - ในที่สุดก็ต้องรีสตาร์ทด้วยตนเอง

ฉันจะบรรลุการเชื่อมต่อกับระบบมากขึ้นหรือรักษาการเชื่อมต่อให้สูงที่สุดเท่าที่จะเป็นไปได้ได้อย่างไร

ในโพสต์อื่นๆ เกี่ยวกับหัวข้อนี้ บางคนแนะนำให้ลด maxThreads เช่นกัน (สมมติว่าเสร็จสิ้นอย่างรวดเร็ว) อาจให้ประสิทธิภาพที่ดีขึ้น

อัปเดต:

ในไฟล์คุณสมบัติแอปพลิเคชันของฉันฉันมีการตั้งค่าต่อไปนี้:

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=ตรวจสอบความถูกต้อง
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
by flag
ข้อความเหล่านั้นไม่ได้ส่งโดยกลุ่มเธรดที่ใช้งานได้ของ Tomcat แต่ส่งโดยกลุ่มการเชื่อมต่อฐานข้อมูลของคุณ คุณสามารถเพิ่มการกำหนดค่าของพูลการเชื่อมต่อ DB ของคุณได้หรือไม่
RebRy avatar
tk flag
ขอบคุณสำหรับการตอบสนองของคุณ Piotr - ในฐานข้อมูลของฉัน ฉันได้ตรวจสอบไฟล์การกำหนดค่า (postgres) แล้ว และตั้งค่า maxConnections เป็น 500 การตั้งค่าถูกกำหนดไว้ที่ฝั่งเซิร์ฟเวอร์ postgres หรือไม่
Piotr P. Karwasz avatar
by flag
แอปพลิเคชันของคุณอาจใช้พูลการเชื่อมต่อ (Tomcat JDBC, DBCP2, HikariCP เพื่อระบุความเป็นไปได้บางประการ) แต่ละคนมีการกำหนดค่าในลักษณะที่แตกต่างกัน เมื่อ [กูเกิลข้อความแสดงข้อผิดพลาดของคุณ](https://www.google.com/search?q=size%3A100%3Bbusy%3A100%3Bidle%3A0%3Blastwait%3A30000) คุณอาจเดาได้ว่าคุณกำลังใช้ Tomcat JDBC ทำตาม [เอกสารประกอบ](https://tomcat.apache.org/tomcat-9.0-doc/jdbc-pool.html) เพื่อเพิ่ม `maxActive` (โดยค่าเริ่มต้น 100)
RebRy avatar
tk flag
ใช่ - ใช้ Tomcat JDBC - เนื่องจากฉันยังใหม่กับสิ่งนี้ ฉันคิดไม่ออกว่าจะค้นหาการตั้งค่าเหล่านี้ได้จากที่ใด สิ่งนี้ช่วยได้มาก - ขอบคุณสำหรับการโพสต์ลิงก์!
Piotr P. Karwasz avatar
by flag
BTW: หากคุณมีเธรดที่ใช้งานได้ 100 เธรดและการเชื่อมต่อฐานข้อมูล 100 การเชื่อมต่อในพูล แอปพลิเคชันของคุณอาจรั่วไหลของการเชื่อมต่อ (กล่าวคือ ไม่ส่งกลับไปยังพูล) คุณอาจลองใช้คุณสมบัติ `logAbandoned` และ `removeAbandoned` ของพูลเพื่อค้นหา
RebRy avatar
tk flag
ฉันได้อัปเดตที่นี่เพื่อแสดงคุณสมบัติแอปพลิเคชัน (ซึ่งฉันคิดว่ากำหนด / ค่าเริ่มต้นเป็นค่าที่ฉันได้รับจากข้อผิดพลาด) ฉันยังไม่มีโอกาสทดสอบในการผลิตเลย
Score:1
ธง by

แอปพลิเคชันของคุณประสบปัญหาจากพูลการเชื่อมต่อฐานข้อมูลหมดลง: เนื่องจากคุณมีเธรดการทำงานใน Tomcat (100) มากกว่าการเชื่อมต่อที่มีอยู่ในพูลการเชื่อมต่อ (60) เธรดจำนวนมากจึงจำเป็นต้องรอให้มีการเชื่อมต่อ คุณควรมีการเชื่อมต่อไปยังฐานข้อมูลอย่างน้อยเท่าที่คุณมีเธรดการทำงาน ลองด้วย:

spring.datasource.tomcat.max-active=200

สังเกต: เนื่องจากคุณ <Connector> ไม่มี ผู้ดำเนินการ คุณลักษณะที่ <Executor> ที่คุณสร้างจะไม่ถูกใช้และสามารถลบได้ (เว้นแต่ตัวเชื่อมต่ออื่นจะใช้)

เนื่องจากไม่มี spring.jpa.hibernate.connection.provider_class คุณสมบัติ ไม่มีการสร้างพูลการเชื่อมต่อ C3P0 ที่คุณพยายามกำหนดค่า: ไฮเบอร์เนตจะใช้อันที่กำหนดค่าผ่าน spring.datasource.* คุณสมบัติ. คุณจึงสามารถลบคุณสมบัติที่เกี่ยวข้องกับ C3P0 ได้

RebRy avatar
tk flag
น่าเสียดาย - ด้วยการเปลี่ยนแปลงเหล่านี้ บริการยังคงมีข้อผิดพลาดเดิม "หมดเวลา: พูลว่าง ไม่สามารถเรียกการเชื่อมต่อใน 30 วินาที ไม่มีเลย[ขนาด:100; ไม่ว่าง:100; ไม่ได้ใช้งาน:0; Lastwait:30000]" (ฉันเพิ่ม maxConnections=300 ไปยังไฟล์
Piotr P. Karwasz avatar
by flag
เนื่องจากกลุ่มการเชื่อมต่อดูเหมือนจะไม่เปลี่ยนแปลงหลังจากการกำหนดค่าใหม่ แอปพลิเคชันของคุณอาจไม่ใช้กลุ่มการเชื่อมต่อของ Spring แต่ใช้กลุ่มการเชื่อมต่ออื่น ตรวจสอบว่าคุณไม่มี `` คำจำกัดความของประเภท `javax.sql.DataSource` ในโฟลเดอร์ Tomcat `conf` ของคุณ (สามารถอยู่ในไฟล์ต่างๆ ได้หลายไฟล์)
RebRy avatar
tk flag
ฉันกำลังมองย้อนกลับไปที่ปัญหานี้อีกครั้ง (เนื่องจากเราจัดการกับมันได้) และกำลังทบทวนความสามารถในการปรับการตั้งค่าของเราอีกครั้ง และพลาดรายละเอียดในคำพูดของคุณ -- ฉันเห็นโค้ดที่ให้ความคิดเห็นบางส่วนใน server.xml ของเรา : . การไม่แสดงความคิดเห็นในบรรทัดเหล่านี้จะใช้ตัวดำเนินการที่กำหนดไว้ก่อนหน้านี้ในไฟล์ server.xml หรือไม่ มีวิธี echo/print/log คุณสมบัติ/การกำหนดค่าเหล่านี้ในการบันทึกการเริ่มต้นของ java/tomcat หรือไม่

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา