wesd#
2.1cpu
- cpu选型
根据数据库类型
OLTP:IO密集型(事物数比较多)-i系列
OLAP:cpu密集型(查询比较多)-E系列
i系列,主频高,核心数少
E系列:主频相对较低,核心数量多
- cpu运行模式
cpu一般主要分为下面这四种模式
yum install -y tuned # 安装tuned工具
systemctl starttuned # 启动/停止tuned服务
systemctl enable tuned # 自启动/禁止自启动
tuned-adm profile throughput-performance # 开启高性能
tuned-adm active # 显示当前性能模式
tuned-adm off # 关闭
tuned服务的相关配置目录:
/usr/lib/tuned/ # 原生的性能模式
├── balanced
│ └── tuned.conf
├── desktop
│ └── tuned.conf
├── functions
├── latency-performance
│ └── tuned.conf
├── network-latency
│ └── tuned.conf
├── network-throughput
│ └── tuned.conf
├── powersave
│ ├── script.sh
│ └── tuned.conf
├── recommend.conf
├── throughput-performance
│ └── tuned.conf
├── virtual-guest
│ └── tuned.conf
└── virtual-host
└── tuned.conf
/etc/tuned # DIY的性能模式
├── active_profile # 当前的性能模式
├── bootcmdline
└── tuned-main.conf
tuned-adm list # 显示host上能运行的性能模式
Available profiles:
- balanced # 平衡模式
- desktop
- latency-performance # 低延迟的性能模式
- network-latency
- network-throughput
- powersave # 节能模式
- throughput-performance # 高吞吐量优化模式
- virtual-guest # 虚拟客人模式
- virtual-host
- oracle # oracle模式
常用模式介绍:
balanced
它的目的是成为性能和功耗之间的折衷。它试图尽量使用自动调节。它有好的结果对于大多数负载。唯一的缺点是增加了延迟。在当前调释放它使CPU、磁盘、音频和视频插件和激活ondemand调控器。radeon_powersave设置为自动。
latency-performance
低延迟的性能模式。它禁用电能节约机制,使sysctl设置提高延迟。CPU调节器将性能低的CPU锁定C状态(通过PM QoS)。
throughput-performance
高吞吐量优化模式。它禁用电能节约机制,使sysctl设置提高吞吐量性能的磁盘、网络IO和转向最后期限的调度器。CPU调试器设置为性能模式。
virtual-guest
基于企业存储配置文件,在其他任务,增加虚拟内存swappiness和减少磁盘预读值。它没有禁用磁盘屏障。
2.2阵列卡配置建议
raid10(推荐)
SSD或者PCI-E或者Flash
强制回写(Force WriteBack)
BBU 电池 : 如果没电会有较大性能影响、定期充放电,如果UPS、多路电源、发电机。可以关闭。 关闭预读
有可能的话开启Cache(如果UPS、多路电源、发电机。)
3.1 文件句柄
Linux中所有的事物或资源都是以文件的形式存在,比如消息、共享内存、连接等,句柄可以理解为指向这些文件的指针。
做linux系统上的后端代码开发,偶尔会碰到后台报错:too many file open XXXX ,紧跟着是socket open timeout 。这种情况大部分是因为linux 文件句柄数满掉引起的。排查方法如下:
linux操作系统默认的句柄数为1024,windows默认的句柄数为6万。所以linux操作系统更容易出现句柄数不够用的情况。但是1024的句柄数在大部分情况下也是够用的,除非这台linux是类似:日志服务器、监控服务器等提供服务,并且被大量IP链接的才需要扩大句柄数
查看默认的文件句柄
修改文件句柄数(一定要大于数据库的最大连接数)
[root@db01 ~]# vim /etc/security/limits.conf
后面追加下面两行
重新查看下文件句柄数
3.2内核优化
vim /etc/sysctl.conf
vm.swappiness <= 5(也可以设置为0)
vm.dirty_ratio <= 20
vm.dirty_background_ratio <= 10 net.ipv4.tcp_max_syn_backlog = 819200
net.core.netdev_max_backlog = 400000
net.core.somaxconn = 4096
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=0
3.3防火墙
禁用selinux : /etc/sysconfig/selinux 更改SELINUX=disabled
iptables如果不使用可以关闭。可是需要打开MySQL需要的端口号
max_connections=单节点不高于3000
max_used_connections
back_log
max_connect_errors=大一点。
wait_timeout=600
interactive_wait_timeout=600
net_read_timeout
net_write_timeout
max_allowed_packet
参数详解:
max_connections(可动态修改)
最大连接数,如果服务器的请求比较大,可以适当的调高这个值,当然这样就会有更多的资源开销,因为如果连接数越来越多,mysql会为每个连接提供一个缓冲区.max_used_connections(可动态修改)
max_user_connections:限制每个用户的session连接个数,例如max_user_connections=1 ,那么用户u1只能连接的session数为1,如果还有用户u2,还是可以连接,但是连接数仍然为1
max_connections :是对整个服务器的用户限制,整个服务器只能开这么多session,而不考虑用户!back_log 堆栈(需重启)
(1) back_log简介
back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。
也就是说,如果MySql的连接数据达到max_connections时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即back_log,
如果等待连接的数量超过back_log,将不被授予连接资源。将会报:unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待连接进程时.
back_log值不能超过TCP/IP连接的侦听队列的大小。若超过则无效,
查看当前系统的TCP/IP连接的侦听队列的大小命令:
cat /proc/sys/net/ipv4/tcp_max_syn_backlog
目前系统为1024。对于Linux系统推荐设置为小于512的整数。
(2)判断依据
show full processlist
发现大量的待连接进程时,就需要加大back_log或者加大max_connections的值
(3)修改方式举例
vim /etc/my.cnf
back_log=1024
不可动态修改
- max_connect_errors(可动态修改)
(1简介)
如果MySQL服务器连续接收到了来自于同一个主机的请求,而且这些连续的请求全部都没有成功的建立连接就被中断了,当这些连续的请求的累计值大于max_connect_errors的设定值时,MySQL服务器就会阻止这台主机后续的所有请求,其实这个就是因为由于网络异常而中止数据库连接。
这个参数还是有些不同的意见的,看字面意思,很容易理解错误。
例如理解为:
密码输入错误的尝试次数超过max_connect_errors变量,MySQL就会阻塞这个客户端登录,这个就是错误的。
但我们有错误密码输入登录到数据库时,我们是可以在performance_schema.host_cache中查看对应的记录。
(2如何设置)
可以设置稍微大些
- wait_timeout(可动态修改)
指的是mysql在关闭一个非交互的连接之前所要等待的秒数 - interactive_timeout(可动态修改)
指的是mysql在关闭一个交互的连接之前所需要等待的秒数,比如我们在终端上进行mysql管理,使用的即使交互的连接,这时候,如果没有操作的时间超过了interactive_time设置的时间就会自动的断开,默认的是28800,可调优为7200。
长链接和短链接的判断依据:
wait_timeout:如果设置太小,那么连接关闭的就很快,从而使一些持久的连接不起作用.cpu会非常繁忙。一直在分配资源回收资源
设置建议
如果设置太大,容易造成连接打开时间过长,在show processlist时候,能看到很多的连接 ,一般希望wait_timeout尽可能低
修改方式举例
wait_timeout=60
interactive_timeout=1200
长连接的应用,为了不去反复的回收和分配资源,降低额外的开销。
一般我们会将wait_timeout设定比较小,interactive_timeout要和应用开发人员沟通长链接的应用是否很多。如果他需要长链接,那么这个值可以不需要调整。
另外还可以使用类外的参数弥补。
- net_read_timeout
数据读取超时时间。在终止读之前,从一个连接获得数据而等待的时间秒数;当服务正在从客户端读取数据时,net_read_timeout控制何时超时。即客户端执行数据读取,等待多少秒仍未执行成功时自动断开连接。
- net_write_timeout
数据库写超时时间。和net_read_timeout意义类似,在终止写之前,等待多少秒把block写到连接;当服务正在写数据到客户端时,net_write_timeout控制何时超时
- max_allowed_packet
Server接受的数据包大小。有时候大的插入和更新会受 max_allowed_packet 参数限制,导致写入或者更新失败。
默认是32m,最大设置为1G
sql_safe_updates =1
slow_query_log =ON
slow_query_log_file =/xxx
long_query_time =1
log_queries_not_using_indexes =ON
log_throttle_queries_not_using_indexes = 10
sort_buffer\join_buffer\read_buffer\read_rnd_buffer,建议不超过8M
tmp_table、heap_table,建议不要超过128M
sql_mode,建议保持默认。
max_execution_time,建议跑批量是设置较大。
lock_wait_timeout,建议设置在60秒以内
lower_case_table_names=1
thread_cache_size=64
character_set_server==utf8或者utf8mb4
log_timestamps=SYSTEM
init_connect="set names utf8"
event_scheduler =OFF
secure-file-priv =/xxx
expire_logs_days =10
sync_binlog =1
log-bin =/opt/log/mysql/blog/mysql-bin
log-bin-index =/opt/log/mysql/blog/mysql-bin.index
max_binlog_size =500M
binlog_format =ROW
max_binlog_cache_size =2G
max_binlog_stmt_cache_size=2G
-
sql_safe_updates
安全更新模式
slow_query_log =ON
slow_query_log_file =/xxx
long_query_time =1
慢日志相关的参数。默认时间为s
log_queries_not_using_indexes =ON
开启 记录没有使用索引查询语句log_throttle_queries_not_using_indexes
若开启,则表示记录所有未使用索引的SQL,无论是否超过long_query_time所设置的值。
不遵循long_query_time。sort_buffer
sort buffer是系统中对数据进行排序的时候用到的Buffer。
sort buffer同样是针对单个线程的,所以当多个线程同时进行排序的时候,系统中就会出现多个sort buffer。
我们一般可以通过增大sort buffer的大小来提高order by或者group by的处理性能。
系统默认大小时2MB,最大限制和join buffer一样。join_buffer
当我们的join是ALL,index,rang或者Index_merge的时候使用的buffer。
实际上这种join被称为FULL JOIN。
实际上参与join的每一个表都需要一个join buffer。
所以在join出现的时候,至少是2个。
join buffer的这只在mysql5.1.23版本之前最大为4G,但是从5.1.23版本开始,再出了windows之外的64为平台上可以超出4GB的限制。
-read_buffer
是MySQL读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区,MySQL会为它分配一段内存缓冲区。read_buffer_size变量控制这一缓冲区的大小。如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能read_rnd_buffer
tmp_table_size、heap_table_size
这两个参数是mysql对临时表的大小控制
其中
tmp_table_size 控制内存临时表的最大值,超过限值后就往硬盘写,写的位置由变量 tmpdir 决定
max_heap_table_size 用户可以创建的内存表(memory table)的大小.这个值用来计算内存表的最大行数值。
sql_mode
sql_mode='ONLY_FULL_GROUP_BY,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,
ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,PIPES_AS_CONCAT,ANSI_QUOTES'max_execution_time