SpringBoot的参数配置
JAVA -jar webdemo1.1.0.jar --server.tomcat.maxconnections=1 -- server.tomcat.acceptCount=1
- ⑦ 线程数调整
线程太少 , CPU利用率过低 , 程序的吞吐量变小 , 资源浪费 , 容易堆积 。线程数调为多少合适?
线程太多 , 上下文频繁切换 , 性能反而变低 。
场景代入:服务器配置2核 , 不考虑内存问题 。SpringBoot的参数配置
收到请求 , java代码执行耗时50ms , 等待数 据返回50ms 。
理想的线程数量= (1 + 代码阻塞时间/代码执行时间) * cpu数量。
实际情况是跑起代码 , 压测环境进行调试 。不断调整线程数 , 将CPU打到80~90%的利用率 。
java -jar web-demo-1.1.0.jar --server.tomcat.maxThreads=500
- ⑧ 场景描述
有一家足疗店 , 只有两个足浴的位置 。
假设一个足浴技师 , 接待一个客人需要30分钟 , 接待一个客人后 , 休息30分钟 。
请问:这家需要几个技师?4个技师
文章插图
一个线程在一个cpu里面执行 , 请求执行需要50毫秒 , 休息50毫秒 , 理想的线程数量就是(二)示例
cpu的数量 * (1+ 50ms/50ms) , 1个cpu就是2个线程 。
- ① 代码
WebDemoApplicationimport org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.scheduling.annotation.EnableAsync;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.Random;import java.util.concurrent.Callable;@SpringBootApplication@RestController@EnableAsyncpublic class WebDemoApplication { public static void main(String[] args) { SpringApplication.run(WebDemoApplication.class, args); } // 这个方法固定延时3秒 , 用于测试线程/连接数量控制 @RequestMapping("/testCount") public String testCount() throws InterruptedException { Thread.sleep(3000);// connections acceptCount return "Success"; } @RequestMapping("/test") public String benchmark() throws InterruptedException { System.out.println("访问test:" + Thread.currentThread().getName()); // 这段代码 , 一直运算 。for (int i = 0; i < 200000; i++) { new Random().nextInt(); } // 50毫秒的数据库等待 , 线程不干活 Thread.sleep(50L); return "Success"; } // 异步支持 @RequestMapping("/testAsync") public Callable<String> benchmarkAsync() throws InterruptedException { return new Callable<String>() { @Override public String call() throws Exception { System.out.println("访问testAsync:" + Thread.currentThread().getName()); // 这段代码 , 一直运算 。for (int i = 0; i < 200000; i++) { new Random().nextInt(); } // 50毫秒的数据库等待 , 线程不干活 Thread.sleep(50L); return "Success"; } }; }}
application.ymlserver: port: 8080
pom.xml<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.study.chapter-3</groupId> <artifactId>web-demo</artifactId> <version>1.1.0</version> <name>web-demo</name> <description>Tomcat调优代码</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.6.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>
推荐阅读
- 如何使用linux脚本监控Tomcat服务器是否宕机和宕机后自动重启
- 网络分层模型及HTTP/TCP/IP/Socket介绍
- Linux安装JDK 以及 tomcat 和mysql
- java服务 tomcat安装,不要太简单
- Linux中断处理
- 什么是cc,网站如何应对cc攻击?
- 推荐几款黑客和网络安全人员都在用的软件
- 旧婚纱怎么处理 白色婚纱怎么洗白
- 马桶晃动修复教程,马桶开胶晃动怎么处理
- 任雪案矿长怎么处理 害死任雪的矿长死了没