Rumah  >  Artikel  >  Java  >  Bagaimana untuk membenamkan kapasiti konkurensi Tomcat dalam SpringBoot

Bagaimana untuk membenamkan kapasiti konkurensi Tomcat dalam SpringBoot

WBOY
WBOYke hadapan
2023-05-11 23:13:101221semak imbas

Temui isu kontena serentak

Bagaimana untuk membenamkan kapasiti konkurensi Tomcat dalam SpringBoot

Bagaimana untuk membenamkan kapasiti konkurensi Tomcat dalam SpringBoot

Jalankan ujian tekanan 6000 utas pada antara muka tunggal, dengan setiap utas meminta 5 kali urutan dibuat dalam masa 5 saat, masa respons permintaan terlalu lama dan kadar ralat mencapai 43%. Kapasiti serentak ini agak lemah untuk pelayan dengan konfigurasi yang lebih baik.

Pergi jauh ke dalam lapisan bawah SpringBoot untuk memahami sebabnya

Konfigurasi metadata disebut dalam dokumentasi SpringBoot rasmi

Bagaimana untuk membenamkan kapasiti konkurensi Tomcat dalam SpringBoot

Anda boleh lihat, tentang kami Konfigurasi lalai port bagi item tetapan yang paling biasa digunakan adalah antaranya.

Konfigurasi Tomcat terbenam lalai

1. , tolak pemprosesan selepas menunggu baris gilir penuh, lalai 100.

2. server.tomcat.max-connections: bilangan maksimum sambungan, lalai ialah 10000

3 server.tomcat.max-threads: bilangan maksimum benang yang berfungsi, lalai ialah 200,

4 server.tomcat.min-spare-threads: bilangan minimum utas yang berfungsi, bilangan utas peruntukan awal, lalai ialah 10

Di bawah konfigurasi lalai , sambungan akan ditolak selepas bilangan sambungan melebihi 10,000

Di bawah konfigurasi lalai, pemprosesan akan ditolak selepas permintaan yang dicetuskan melebihi 200+100 (bilangan maksimum rangkaian pekerja + panjang gilir menunggu)

Sudah tentu Spring menyediakan fungsi konfigurasi luaran untuk metadata ini

#更改内嵌tomcat参数
server.port=8080
## 等待队列长度,默认100。
server.tomcat.accept-count=1000
## 最大工作线程数,默认200。(4核8g内存,线程数经验值800,操作系统做线程之间的切换调度是有系统开销的,所以不是越多越好。)
server.tomcat.max-threads=800
## 最小工作空闲线程数,默认10。(适当增大一些,以便应对突然增长的访问量)
server.tomcat.min-spare-threads=100

SpringBoot mempunyai Tomcat terbina dalam Dalam tetapan lalai, bilangan maksimum utas Tomcat ialah 200 dan maksimum bilangan sambungan ialah 10,000. Jumlah konkurensi yang disokong merujuk kepada bilangan sambungan. Bagaimanakah 200 utas boleh mengendalikan 10,000 sambungan?

Pada masa ini, Tomcat mempunyai tiga mod untuk memproses sambungan Satu ialah BIO, dengan satu utas hanya mengendalikan satu sambungan, dan satu lagi ialah NIO, yang satu utas mengendalikan berbilang sambungan. Memandangkan permintaan HTTP tidak mengambil masa terlalu lama, dan berbilang sambungan secara amnya tidak menerima mesej pada masa yang sama, tiada masalah besar dalam memproses berbilang sambungan dengan satu utas.

Terdapat juga mod apr ketiga-tiga mod tomcat ini akan diperkenalkan secara terperinci kemudian dan tidak akan dibincangkan secara mendalam di sini.

Apabila Tomcat bermula, anda boleh melihat mod pengendalian mana yang digunakan oleh Penyambung melalui log:

Starting ProtocolHandler ["http-bio-8080"]
Starting ProtocolHandler ["http-nio-8080"]
Starting ProtocolHandler ["http-apr-8080"]

Nilai lalai boleh didapati dalam spring-boot-autoconfigure-version number.jar (untuk contoh: pakej spring-boot-autoconfigure-2.1.0.RELEASE), nyahzip dan nyahkompilasi fail /web/ServerProperties.class untuk melihat konfigurasi lalai.

Bagaimana untuk membenamkan kapasiti konkurensi Tomcat dalam SpringBoot

Pembangunan Tomcat terbenam tersuai

Bagaimana untuk membenamkan kapasiti konkurensi Tomcat dalam SpringBoot

Mengenai KeepAlive

Permintaan HTTP menggunakan Jmeter Lalainya adalah untuk dayakan KeepAlive

Permintaan KeepAlive Http ialah apabila pelanggan kami menghantar permintaan Http ke pelayan kami, jika pengepala permintaan KeepAlive disertakan, ini bermakna pelanggan Http kami ingin mengikuti sambungan KeepAlive diwujudkan antara pelayan tujuan sambungan ini ialah selepas menghantar respons yang sepadan kepada pelayan kami, pelayan kami tidak seharusnya memutuskan sambungan serta-merta, tetapi tunggu untuk cuba menggunakan semula sambungan tersebut.

Penyelesaian ini digunakan untuk menyelesaikan masalah yang memakan masa yang disebabkan oleh tindak balas Http, stateless, terputus sambungan dan sambungan baharu setiap kali.

Tetapi jika kami mengekalkan sambungan yang lama dengan pelayan selepas setiap permintaan halaman web dibuka, maka bilangan sambungan pada pelayan kami akan habis tidak lama lagi, jadi tiada perkara sedemikian dalam Http1.0 yang terawal Permintaan KeepAlive direka, tetapi permintaan Http1.1 plus KeepAlive semasa ditujukan kepada lebih banyak peranti mudah alih, malah beberapa interaksi halaman web yang sangat kompleks, yang memerlukan permintaan kerap kepada pelayan semasa proses menyemak imbas pengguna. Oleh itu, mewujudkan sambungan KeepAlive bukan untuk tujuan ujian tekanan, tetapi ia sebenarnya mempunyai beberapa faedah prestasi dalam senario aplikasi Sama ada klien atau pelayan, apabila melakukan beberapa interaksi komunikasi rangkaian, Tidak perlu mencipta yang baharu sambungan setiap kali, putuskan sambungan, dan buang masa pada penubuhan sambungan Tcp/Ip, tetapi hanya perlu menghantar data.

Tetapi reka bentuk sebegitu juga akan membawa beberapa masalah Jika pelayan kami tidak mengenakan sebarang sekatan ke atas pengendalian KeepAlive 1. Sambungan tidak melakukan sebarang operasi atau bertindak balas, maka sambungan ini tidak akan memberi kesan kepada. 2. Sesetengah penyerang secara berniat jahat menggunakan sambungan KeepAlive untuk menghantar serangan DDOS ke pelayan kami Sambungan yang sepadan pada pelayan hanya akan menjadi pintu belakang untuk menyerang penyerang, kami perlu menyesuaikan pembangunan Tomcat

Konfigurasi

1. KeepAliveTimeOut: Berapa milisaat selepas itu pelanggan tidak bertindak balas sebelum KeepAlive diputuskan sambungan

2. Berapa banyak permintaan selepas itu KeepAlive terputus dan gagal.

在SpringBoot官方文档中提到了对内嵌容器的配置

Bagaimana untuk membenamkan kapasiti konkurensi Tomcat dalam SpringBoot

//当spring容器内没有TomcatEmbeddedServletContainerFactory这个bean时,会把bean加载进spring容器
@Configuration
public class WebServerConfiguration implements WebServerFactoryCustomizer<configurablewebserverfactory> {
@Override
public void customize(ConfigurableWebServerFactory factory) {
  //使用对应工厂类提供给我们的接口定制化我们的tomcat connector
  ((TomcatServletWebServerFactory)factory).addConnectorCustomizers(new TomcatConnectorCustomizer() {
    @Override
    public void customize(Connector connector) {
      Http11NioProtocol protocol= (Http11NioProtocol) connector.getProtocolHandler();
      //定制KeepAliveTimeout,设置30秒内没有请求则服务器自动断开keepalive连接
      protocol.setKeepAliveTimeout(30000);
      //当客户端发送超过10000个请求则自动断开keepalive连接
      protocol.setMaxKeepAliveRequests(10000);
    }
  });
}
}</configurablewebserverfactory>

Atas ialah kandungan terperinci Bagaimana untuk membenamkan kapasiti konkurensi Tomcat dalam SpringBoot. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam