高并发条件下,数据库应该用什么样的机器
- 对于数据库而言,通常推荐使用至少8核16G以上的机器,最好选用8核32G的机器,因为数据库需要执行大量的磁盘IO操作,他的每个请求都比较耗时一些,所以机器的配置需要高一些。
- 一般8核16G的机器部署的MYSQL数据库,每秒抗一两千个并发请求是没有问题的,但是如果你的并发量再高一些,假设每秒有几千并发请求,那么可能数据库就有点危险了,因为数据库的CPU,磁盘,IO,内存的负载都会比较高,弄不好数据库压力过大会宕机。
对于8核32G,每秒两三千,三四千一般也可以抗得住。 - 对于数据库而言,如果可以的话,最好采用SSD固态硬盘而不是普通的机械硬盘,因为数据库最大的复杂就在于大量的磁盘IO,他需要大量的读写磁盘文件,如果能使用SSD固态硬盘,数据库每秒能抗住的并发请求量会高一些。
QPS &TPS
IO相关的压测性能指标
- IOPS:这个指的是机器的随机IO并发处理的能力,比如机器可以达到200 IOPS,意思就是说每秒可以执行200个随机IO读写请求
你在内存中更新的脏数据库,最后都会由后台IO线程在不确定的时间,刷回到磁盘里去,这就是随机IO的过程。
- 吞吐量:机器的磁盘存储每秒可以读写多少字节的数据量。
我们在执行各种sql语句的时候,提交事务的时候,其实都是大量的会写redo log之类的日志的,这些日志都会直接写磁盘文件。(顺序写入)
- latency:往磁盘里写入一条数据的延迟
因为我们执行sql语句核提交事务的时候,都要顺序写redo log磁盘文件,所以此时你写一条日志到磁盘文件中去,延迟多久对性能是有影响的。
- CPU负载,网络负载,内存负载
理论上,通过增加线程数,内存读写,抗几千并发,甚至上万并发都是可以的。 但是,线程数越来越多之后,切换上下文很费CPU,QPS会下降,CPU负载也会变高,当请求源源不断进来的时候会导致挤压,进一步拖垮系统。
压测
用sysbench工具
基于sysbench构造测试表和测试数据
综合读写测试 oltp_read_write
sysbench --db-driver=mysql --time=15 --threads=10 --report-interval=1 --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=Jie906119240! --mysql-db=test_db --tables=20 --table_size=1000000 oltp_read_write --db-ps-mode=disable run
压测过程中可以不断地增加线程的数量,直到发现数据库的QPS和TPS上不去了。
如果你不停的增加线程的数量,然后发现CPU已经满负荷了,内存使用率特别高,内存不够用,那么这时候测出来的QPS并没有什么用。因为生产环境不可能让数据库一直处于快挂了的阶段。
压测时如何观察机器的指标
top
top - 15:52:00 up 42:35, 1 user, load average: 0.15, 0.05, 0.01
# load average: 0.15, 0.05, 0.01这行信息,他说的是CPU在1分钟、5分钟、15分钟内的负载情况。
Mem: 33554432k total, 20971520k used, 12268339 free, 307200k buffers
# 如果内存的使用率在80%以内,基本都还能接受,在正常范围内;如果你的机器的内存使用率到了70%~80%了,就差不多了,不能再增加了。
压测观察机器的硬盘IO情况
dstat -d
-dsk/total -
read writ
103k 211k
0 11k
解读:存储的IO吞吐量是每秒钟读取103kb的数据,每秒写入211kb的数据,像这个存储IO吞吐量基本上都不算多的,因为普通的机械硬盘都可以做到每秒钟上百MB的读写数据量。
dstat -r
--io/total-
read writ
0.25 31.9
0 253
0 39.0
解读:读IOPS和写IOPS分别是多少,也就是说随机磁盘读取每秒钟多少次,随机磁盘写入每秒钟执行多少次,大概就是这个意思
一般来说,随机磁盘读写每秒在两三百次都是可以承受的。
我们需要在压测的时候密切观察机器的磁盘IO情况,如果磁盘IO吞吐量已经太高了,都达到极限的每秒上百MB了,或者随机磁盘读写每秒都到极限的两三百次了,此时就不要继续增加线程数量了,否则磁盘IO负载就太高了。
压测时观察网卡的流量情况
dstat -n
-net/total-
recv send
16k 17k
解读:每秒钟网卡接收到流量有多少kb,每秒钟通过网卡发送出去的流量有多少kb,通常来说,如果你的机器使用的是千兆网卡,那么每秒钟网卡的总流量也就在100MB左右,甚至更低一些。
我们在压测的时候也得观察好网卡的流量情况,如果网卡传输流量已经到了极限值了,那么此时你再怎么提高sysbench线程数量,数据库的QPS也上不去了,因为这台机器每秒钟无法通过网卡传输更多的数据了。