1.
a. 存储.主机和操作系统: 主机架构稳定性 I/O规划及配置 Swap OS 内核参数 网络问题 b. 应用:(Index,lock,session) 应用程序稳定性和性能 SQL语句性能 串行访问资源 性能欠佳会话管理 c. 数据库优化:(内存.数据库设计.参数) 内存 数据库结构(物理&逻辑) 实例配置
2.
CPU: 计算(主)和调度 (次) MEM: 缓存和缓冲 (用于磁盘) IO: 输入 1. top 命令 (用于查看CPU MEM) a. CPU: [root@db01 ~15:27:42]# top %Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.0 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st 平均占比 最多100% 举列:%Cpu(s): 99.3 us, 0.3 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.3 si, 0.0 st us: 用户程序工作所占用的时间片占比 (用于有效计算--) 这个高表示说明CPU 是在做计算,做正事 sy: 内核工作花费的cpu时间片占比 (用于调度--)如果高表示cpu 在做不正常事,调度占比少比较好 过高原因: 内核本身bug 中病毒等 各种资源的调度和分配 并发很高 锁 id: 空闲的CPU时间片占比 值越小,表示CPU越繁忙 wa: CPU 用来等待的时间片占比 IO 如radio 做的不好 等待大的处理事件 锁 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 实时观察CPU 内存情况 %CPU 当前某个程序占用总CPU的使用率. 如果是4核CPU,满核为400%,如果是单核100%. 压力测试: create database test; use test; source /root/t100w.sql #导入数据 mysqlslap --defaults-file=/etc/my.cnf --concurrency=100 --iterations=1 --create-schema='test' --query="select * from test.t100w where k2='780P'" engine=innodb --number-of-queries=2000 -uroot -p123456abcd -verbose --concurrency=100 : 模拟同时100会话连接 --create-schema='test' : 操作的库是谁 --query="select * from test.t100w where k2='780P'" :做了什么操作 --number-of-queries=2000 : ⼀共做了多少次查询 Running for engine rbose Average number of seconds to run all queries: 648.657 seconds Minimum number of seconds to run all queries: 648.657 seconds Maximum number of seconds to run all queries: 648.657 seconds Number of clients running queries: 100 Average number of queries per client: 20 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 7476 mysql 20 0 1183400 320876 12868 S 99.0 32.2 3:45.84 mysqld 可以看出mysql占用cpu率 ************************************************************************* 在top 界面按数字1,可以看到每片cpu 的使用率.因为有时需要查看每片cpu 是用使用的平均 ************************************************************************* b. 内存 [root@db01 ~22:56:49]# top KiB Mem : 995896 total, 124292 free, 421644 used, 449960 buff/cache KiB Swap: 1048572 total, 1048572 free, 0 used. 396272 avail Mem mysql服务器中一般会禁用掉Swap ,如果是文件服务器可以有这个Swap 主要看这条: 396272 avail Mem 表示可用的内存大小,如果不够可以增加内存条 2. IOstat 命令 (用于查IO) iostat -dk 1 如果没有这个命令用 yum install -y sysstat [root@db01 ~23:17:18]# iostat -dk 1 Linux 3.10.0-957.el7.x86_64 (db01) 02/08/2021 _x86_64_ (1 CPU) Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 0.22 2.99 8.35 187538 523781 scd0 0.00 0.02 0.00 1028 0 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 0.00 0.00 0.00 0 0 scd0 0.00 0.00 0.00 0 0 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 0.00 0.00 0.00 0 0 scd0 0.00 0.00 0.00 0 0 Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn sda 0.00 0.00 0.00 0 0 scd0 0.00 0.00 0.00 0 0 一般情况下,cpu 高,IO 也应该高. 如果:CPU 高 ,IO 比较低 wait 高: 有可能IO出问题了(raid,过度条带化) SYS 高: 有可能是锁的问题,需要进一步去数据库中判断和排查 3. glances 命令(查看cpu mem IO) [root@db01 ~23:30:14]# glances 如果没有可以直接yum install -y glances db01 (CentOS Linux 7.6.1810 64bit / Linux 3.10.0-957.el7.x86_64) Uptime: 17:36:50 CPU [ 3.8%] CPU 3.8% nice: 0.0% MEM 61.2% SWAP 0.0% LOAD 1-core MEM [ 61.2%] user: 2.2% irq: 0.0% total: 973M total: 1024M 1 min: 0.10 SWAP [ 0.0%] system: 1.3% iowait: 0.0% used: 595M used: 264K 5 min: 5.50 idle: 96.5% steal: 0.0% free: 377M free: 1024M 15 min: 30.85 4. htop 命令(查看CPU MEM )
show status show variables show index show processlist show slave status show engine innodb status desc /explain slowlog 扩展类深度优化: PT 系列(pt-query-sigest pt-osc pt-index 等) mysqlslap 压力测试 sysbench information_schema performance_schema (P_S) sys
create database test charset utf8mb4; use test; set sql_log_bin=0; source t100w.sql; grant 0n *.* to root@'localhost' identified by '123456abcd' mysqlslap --defaults-file=/etc/my.cnf --concurrency=100 --iterations=1 --create-schema='test' --query="select * from test.t100w where k2='ABxy'" engine=innodb --number-of-queries=2000 -uroot -p123456abcd -verbose
主机: 真实的硬件(PC server):DELL R系统,华为,浪潮,HP,曙光.联想 云产品: ECS.数据库RDS.DRDS.PolarDB CPU 根据数据库类型 OLTP OLAP IO密集型:线上系统,OLTP主要是IO密集型的业务,高并发 CPU密集型:数据分板数据处理,OLAP,CPU密集型的,需要cpu高计算能力(i 系列,IBM Power系列) cpu密集型: I系列的,主频很高,核心少 IO密集型: E系列的,主频相对低,核心数量多 内存: 建议2-3倍cpu核心数量 ( ECC) 磁盘选择: SATA-III SAS FC SSD 主机 RAID 卡的BBU 关闭 存储: raid0:条带化,性能高 raid1:镜像,安全 raid5:校验+条带化,安全较高+性能较高(读),写性能较低(适合于读多写少) raid10:安全+性能都很高,最少四块磁盘,浪费一增的空间(高IO要求) 网络: 1.硬件买好的(单卡单口) 2.网卡绑定(bonding),交换机堆叠 以上问题,提前规避掉.
Swap 调整 临时调整 echo 0 >/proc/sys/vm/swapiness #将内容改为0,默认为30,当内存达到70%时就会使用Swap分区 永久调整 vim /etc/sysctl.conf 在最后一行增加一行vm.swapiness=0 永久生效 执行sysctl -p IO调度策略 centos7 默认是deadline cat /sys/block/sda/queue/scheduler 临时修改为deadline(centos6) echo deadline >/sys/block/sda/queue/scheduler vim /boot/grub/grub.conf 更改到如下内容: kernel /boot/vmlinuz-2.6.18-e15 ro root=LABEL=/ elevator=deadline rhgb quiet IO: raid no lvm ext4或xfs 最好是xfs ssd IO调度策略
[mysqld] basedir=/data/mysql datadir=/data/mysql/data socket=/tmp/mysql.sock log-error=/var/log/mysql.log log_bin=/data/binlog/mysql-bin binlog_format=row skip-name-resolve server-id=52 gtid-mode=on enforce-gtid-consistency=true log-slave-updates=1 relay_log_purge=0 max_connections=1024 back_log=128 wait_timeout=60 interactive_timeout=7200 key_buffer_size=16M query_cache_size=64M query_cache_type=1 query_cache_limit=50M max_connect_errors=20 sort_buffer_size=2M max_allowed_packet=32M join_buffer_size=2M thread_cache_size=200 innodb_buffer_pool_size=1024M innodb_flush_log_at_trx_commit=1 innodb_log_buffer_size=32M innodb_log_file_size=128M innodb_log_files_in_group=3 binlog_cache_size=2M max_binlog_cache_size=8M max_binlog_size=512M expire_logs_days=7 read_buffer_size=2M read_rnd_buffer_size=2M bulk_insert_buffer_size=8M [client] socket=/tmp/mysql.sock 再次压力测试 : mysqlslap --defaults-file=/etc/my.cnf --concurrency=100 --iterations=1 --create-schema='oldboy' --query="select * from oldboy.t_100w where k2='FGCD'" engine=innodb --number-of-queries=200000 -uroot -p123 -verbose