
最近在搞服务器优化,对于 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 这应该有一个大概的函数关系吧,刚开始的时候提升线程数会增加吞吐量,到达极点以后再增加线程数会导致上下文切换带来的开销过大,反而降低吞吐量。所以如果能做一个实验的话,也许可以拟合出来这个关系? |
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 201901-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 quickma 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 处理效率会降低。我也不知道哪些是对的。 果然还是应该自己掌握压测软件,多调多压…… |