最近在搞服务器优化,对于 tomcat 有很多的疑问。现在 tomcat 使用 nio,之前工作线程线程池最大数量是默认的 200,最近我在想考虑要不要把线程池最大数量提升一些,但是 cpu 实际上能同时运行的也就那么多线程吧?增加工作线程的数量是不是不能提高吞吐量反而会增加 cpu 切换线程的压力?
请大神们指点,另外想找些小伙伴(不只 java,还想找一些服务器运维的大神带飞)一起交流,有 q 群什么的可以发一下哦
1
gz911122 2019-01-23 11:36:36 +08:00
服务器配置跟得上的话可以提高一些
|
2
DovaKeen 2019-01-23 11:41:45 +08:00 1
这应该有一个大概的函数关系吧,刚开始的时候提升线程数会增加吞吐量,到达极点以后再增加线程数会导致上下文切换带来的开销过大,反而降低吞吐量。所以如果能做一个实验的话,也许可以拟合出来这个关系?
|
3
AngryPanda 2019-01-23 11:50:36 +08:00
需要基准测试
|
4
gabon 2019-01-23 11:56:44 +08:00 via Android
先找性能瓶颈啊,IO 密集还是 CPU 密集型的。CPU 密集的再怎么加线程也没用
|
5
qilishasha 2019-01-23 12:02:10 +08:00
你就是改到 10000 也行,能用到 200 的业务不是单服务器能玩的,不要浪费钱在单服务器上了
|
6
liuxey 2019-01-23 12:07:04 +08:00
如果是 CPU 密集型,加了没用,如果是 IO 密集型,增加线程后数据库堵的更慌,所以也没用,要找点问题的点然后去解决。
|
7
luozic 2019-01-23 13:06:52 +08:00 via iPhone
木桶原理,找到系统瓶颈
|
8
Kraken OP @DovaKeen #2 确实是应该有一个函数关系 只不过我想弄清楚每一步的原理,好能更准确的找出那个最优值
@AngryPanda #3 不太懂 我一直在中小公司呆着 我上网查查 @gabon @qilishasha @liuxey #4,#5,#6 是 IO 密集型 现在基础知识缺失较多 不太好找瓶颈在哪里 公司也没有大牛支持 很烦 |
9
qiyuey 2019-01-23 13:35:40 +08:00
压测一下
|
10
neoblackcap 2019-01-23 13:57:15 +08:00 via iPhone
@Kraken 假如你什么都不清楚,那么你应该先用对应的工具进行 profiling,而不是瞎调参数。我记得 Oracle JDK 里面是有可以远程 profiling 的工具,你找找吧。或者自己分流程步骤打日志,定位热点,这样才好改
|
11
micean 2019-01-23 14:01:16 +08:00
如果瓶颈是有更多的线程阻塞在等待数据库 IO,那么增加线程是有用的,直到上下文切换的代价大于此等待 IO 的代价
但是一般从经验上来看,单实例 200 线程足矣 |
12
jicg 2019-01-23 14:04:31 +08:00 via iPhone
这就是 java 头疼之处,tomcat 的优化,很折腾人,弃坑吧,学 golang
|
15
DovaKeen 2019-01-23 14:25:19 +08:00
@Kraken 这个函数我觉得有很多因机器和场景而异的变量,大概是可以测出来一个特定场景的值,但是不能得到一个普适的函数的吧…
|
17
lihongjie0209 2019-01-23 14:37:11 +08:00
@jicg 你觉得用了 go 就不需要了解优化了?
|
18
Kraken OP @lihongjie0209 #17 哈哈哈 不可能的 无论什么语言都是需要优化的 就算是前端 也需要针对客户端优化 毕竟资源是有限的 技术才是硬道理啊!
|
19
x7395759 2019-01-23 15:03:45 +08:00
能
|
20
micean 2019-01-23 15:13:12 +08:00
|
21
NB40B938mff85mtq 2019-01-23 16:18:35 +08:00
调一下 JVM 初始化堆的大小啊。。。立竿见影
|
22
Kraken OP |
23
NB40B938mff85mtq 2019-01-23 17:32:17 +08:00
@Kraken 优化下线程~~~maxThreads、SpareThreads、acceptCount
|
24
Kraken OP @Gempty #23 优化了 maxThreads 从默认的 200 提到了 1000 但是之后没有什么爆款活动了,服务器压力一直不大,想通过理论知识想清楚这样到底能不能提升性能。因为 cpu 是 8 核 16 线程,那理论上无论在哪个瞬间,同时执行的线程数量都只有 16 个才对吧。提高线程数量,只是同时调度的线程数量变多了,那相应的每个线程的处理时间也变得更长,这样还会增加 cpu 切换线程的压力。我个人觉得逻辑应该是这样的。
还有一点就是不知道 fd 用不用调高上限,现在几乎一半的人回答用!另一半人回答不用!还有人说默认的 1024fd 效率是最好的,如果调高 fd 处理效率会降低。我也不知道哪些是对的。 果然还是应该自己掌握压测软件,多调多压…… |