✅4C8G 16台 和 8C16G8台,不考虑成本的情况怎么选?

典型回答

16台4核8G内存的机器,和8台8核16G内存的机器,总资源看上去其实是相等的,但是他们还是有一些区别的,当我们不考虑成本差异的情况下,对于一个Java应用,可以从以下几个方面来考量如何选择。

单机瓶颈:有一点是可以肯定的,那就是不同的应用对于CPU和内存的需求一定是不一样的,虽然这两个方案的总资源是一样的,但是单机资源是不一样的,也就说在单机上的处理能力是有瓶颈的。比如虽然16台4C8G的机器,但是每一台他毕竟是4C8G,如果要用到的内存超过8G,或者CPU需求超过4C,那么他就会带来性能瓶颈。

容错能力:同时更多的服务器节点也可以提供更高的容错能力。如果一台服务器出现故障,对整体系统的影响会更小。

这个尤其是在应用发布过程中就更加明显,当我们采用金丝雀发布进行滚动发布时,重启1/16和重启1/8机器数,对线上业务的影响肯定是不一样的。

负载均衡:而且,更多的服务器意味着负载均衡的发挥空间更大一些,他可以做更平均地分配负载。

连接数瓶颈:还有,有的时候,资源的瓶颈并不仅仅在机器上,还在于连接数,如应用和数据库的连接数、应用和Redis的连接数等。拿MySQL来说,他给单机分配的连接数是固定的(当然也可以调,但是我司是不让调的,超过了这个数要么就自己扩容, 要么就是存在慢SQL),但是通常意味着,机器数越多,总的可用连接数越多,并发度也就更好。

GC相关:另外,站在内存的角度来看,更大的内存意味着可以给JVM分配的内存也就更多一些,他能放下的对象也就更多,那么他的GC次数可能就会更少。但是同时也意味着GC的时长可能也会更长。对于8G内存,一般我们可以给JVM分配4G,16G内存,一般我们可以给JVM分配8G。虽然4G已经达到了G1的最低标准,但是G1来说8G肯定更优。

扩展能力:当我们需要扩展集群的时候,如果机器本身的内存和CPU更厉害的话,那么可能扩容的机器数就不需要那么多,那么扩展速度可能就会更快一些。

总体来说,4C8G *16台在并发处理能力、容错能力、负载均衡、连接数瓶颈等方面更加友好,但是需要考虑单机瓶颈及GC次数、以及扩容效率带来的影响。


而且,用更多小型服务器也更加符合当今的微服务架构的特点。想想当年阿里的去IOE,其中的I不就是把IBM大型机、小型机替换成PC Server嘛。

4C8G *16台 8C16G*8台
单机瓶颈
容错能力 更好 更差
负载均衡 发挥空间大 发挥空间小
连接数瓶颈
GC时长 更短 更长
G1使用 也能用 适合
扩展能力 扩展更慢 扩展更快

所以,如果不是特别的"微"服务,那么意味着他可能需要的内存和CPU资源更多,那么可以考虑用配置更高的。

而如果服务拆分的比较细,每个应用的职责比较清晰,简单,那么他对负载均衡,容错能力的要求就更高,考虑用更多的机器。

原文: https://www.yuque.com/hollis666/xkm7k3/yszywwcftisbsnc5