互联网三高
目录
互联网三高,互相影响,可能提高了一方面其他的也跟着提高
- 高可用
- 高扩展
- 高性能
可用性 Vs. 可靠性
– 如果系统在每小时崩溃1ms,那么它的可用性就超过99.9999%,但是它还是高度不可靠。 与之类似,如果一个系统从来不崩溃,但是每 年要停机两星期,那么它是高度可靠的,但是 可用性只有96%。
高性能包含两部分内容,两者是一个与的关系,
系统优化就是从系统的上游到系统内部到缓存到数据库,提升这两个方面,也就是降低响应延迟,提高吞吐量
- 低延迟(响应快 low-latency)
- 高并发(吞吐量高 high-througput)
一般从降低系统延迟做文章,同时也会提高吞吐量,比如银行柜台从10s钟一个客户,改成5s一个客户,延迟降低了,同时吞吐量也上去了。但是在算法不能突破的情况下,降低系统的响应时间难度非常大,所以现在说的提高性能是指提高系统的吞吐量,可以多加机器(对银行来说就是多加柜台)
系统优化:
- 异步处理:优化响应mq,bio编程nio 非阻塞协议,也是异步
- 负载均衡集群-提高吞吐量
- 热点数据多级缓存-响应
- CDN(动静分离) - 响应(离地近) + 吞吐量(有从机)
- 分库分表-优化吞吐
- 锁优化(互斥-自旋)-响应时间
- 线程池-吞吐量
有个服务需要启动多线程,启动多少个线程给服务最合适
理论上:
线程数=处理器核的数目 x 期望的CPU利用率 x (1+W/C)
W: 执行该任务所花费的等待时间(cpu等待从磁盘io读取数据),C:执行该任务所花费的计算时间,(1+w/c) = (w+c) / c
-
单核cpu设定多线程是否有意义
有,比如执行一个任务需要10s, 其中等待时间5s,计算时间5s, 那么显然最好是两个线程(1+5/5),也可以根据上述公式推导
-
工作线程数是不是设置的越大越好,当然不是,根据公式可以算出最优解
-
工作线程数(线程池中的线程数量)设置多少合适
w/c得不到精确的值,实际上是需要做压测才能推导出,一般是根据经验先设置一个初始值(2N+1),然后通过压测(jmeter)进行上下调整
压榨机器提升性能,两个方面:锁+多线程