echo "deadline" >> /sys/block/sdb/queue/scheduler #這裏sdb修改成實際的設備名稱,例如sda,或者sdc。
vim /etc/grub.conf kernel /vmlinuz-2.6.32-504.el6.x86_64 ro root=UUID=af13b3dc-c142-42b7-8ed6-cb7c60608af2 rd_NO_LUKS KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet elevator=deadline numa=off #要當前生效能夠這樣設置 cat /sys/block/sda/queue/scheduler echo deadline > /sys/block/sda/queue/scheduler
cat /sys/block/sda/queue/scheduler noop anticipatory [deadline] cfq
#在kernel那行增長一個配置後重啓生效,例如: kernel /vmlinuz-2.6.18-308.el5 ro root=LABEL=/1 elevator=deadline numa=off rhgb quiet
numactl -- interleave=all /usr/bin/mysqld_safe --datadir="$datadir" --socket="$socketfile" \ --log-error="$errlogfile" --pid-file="$mypidfile" \ --user=mysql >/dev/null 2>&1
修改最大文件描述符,關閉selinuxnode
ulimit -SHn 65535 echo "ulimit -SHn 65535" >> /etc/rc.local cat >>/etc/security/limits.conf<<EOF * soft nproc 102400 * hard nproc 102400 * soft nofile 102400 * hard nofile 102400 EOF sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
內核參數調整
swappiness是Linux的一個內核參數,用來控制Linux物理RAM內存進行SWAP頁交換的相對權重,儘可能減小系統緩存被從內存中清除的狀況。取值範圍是0~100,vm.swappiness的值越低,Linux內核會盡可能不進行SWAP交換頁的操做,vm.swappiness的值越高,linux會越多的使用SWAP空間。Linux系統的默認值是60,當系統須要內存時,有60%的機率使用SWAP。對於大多數桌面系統設置爲100,能夠提升系統的總體性能;對於數據庫應用服務器設置爲0,能夠提升物理內存的使用率,進而提升數據庫服務響應性能。須要注意的是RHEL7以上版本,若是vm.swappiness = 0,有可能會因爲OOM問題,致使mysqld進程被OOM-Killer進程殺掉。python
減小swap的使用率,若是設置爲0,須要結合vm.overcommit_memory=2,能夠儘可能避免OOM,通常設置爲1mysql
vm.swappiness=1
默認值是3797,保證物理內存有足夠空閒空間,防止突發性換頁linux
vm.min_free_kbytes=204800
默認是100,增大這個參數設置了虛擬內存回收directory和i-node緩衝的傾向,這個值越大。越易回收,儘可能保留可用內存ios
vm.vfs_cache_pressure=150
確保能持續將髒數據刷新到磁盤,避免瞬間I/O寫,產生嚴重等待和設置MySQL中的innodb_max_dirty_pages_pct低一點原理相似
當文件系統緩存髒頁數量達到系統內存百分之多少時(默認10%)就會觸發pdflush/flush/kdmflush等後臺回寫進程運行,將必定緩存的髒頁異步地刷入硬盤c++
vm.dirty_background_ratio=5
當文件系統緩存髒頁數量達到系統內存百分之多少時(默認20%),系統會中止全部的應用層的IO寫操做,等待刷完數據後恢復IO。sql
vm.dirty_ratio=10
減小TIME_WAIT,提升TCP效率;數據庫
net.ipv4.tcp_tw_recycle=1 net.ipv4.tcp_tw_reuse=1
jemalloc內存分配方式與系統默認安裝的glic的malloc內存分配方式相比,能提升MySQL的性能,下降了系統CPU和內存資源的利用,關於這方便的壓測數據,請參考:http://www.linuxeye.com/Linux/1914.html
編譯安裝很簡單vim
wget http://www.canonware.com/download/jemalloc/jemalloc-3.6.0.tar.bz2 tar xvf jemalloc-3.6.0.tar.bz2 ./configure make && make install #已方便安裝好mysql後使用,使用也很簡單在[mysqld_safe] 加上malloc-lib= /usr/local/lib/libjemalloc.so
爲了提升磁盤操做性能,當前的數據庫系統都採用異步IO(Asynchronous IO,AIO)的方式來處理磁盤操做。InnoDB存儲引擎亦是如此。
在InnoDB1.1.x以前,AIO的實現經過InnoDB存儲引擎中的代碼來模擬實現。而從InnoDB 1.1.x開始(InnoDB Plugin不支持),
提供了內核級別AIO的支持,稱爲Native AIO。所以在編譯或者運行該版本MySQL時,須要libaio庫的支持,centos最小化安裝默認是沒有安裝的,安裝也簡單:
yum install libaio-devel
網卡軟中斷不平衡,集中在一個CPU核心上(mpstat 查看%soft集中,一般是cpu0),綁定軟中斷多個核心上,能夠用兩個腳原本綁定。本身喜歡用哪一個都行:
vim set_irq_affinity.py #!/usr/bin/env python import re from os import system,popen from os import walk as walkdir from optparse import OptionParser RPS_CPUS_VALUE = 'ffffffff' RPS_FLOW_VALUE = '4096' RPS_RFS_DEFAULT = '0' interrupts_file = '/proc/interrupts' rps_cpus_list = [] rps_flow_list = [] #ENTRY_VALUE=32768 def get_device(): return re.findall(r'([a-z]+\d+)\s+Link.*',popen('ifconfig').read()) def get_rfs_rps_file(net_device): rps_path = '/sys/class/net/' + net_device + '/queues/' for s in walkdir(rps_path): if len(s[2]) == 2: rps_cpus_list.append('/'.join([s[0],s[2][0]])) rps_flow_list.append('/'.join([s[0],s[2][1]])) def file_hander(TARGET,VALUE='0'): try: f_hander = open(TARGET,'w') f_hander.write(VALUE) finally: f_hander.close() def set_rfs_rps(net_device): get_rfs_rps_file(net_device) def set_rps_cpus_value(PATH): file_hander(PATH,RPS_CPUS_VALUE) def set_rps_flow_value(PATH): file_hander(PATH,RPS_FLOW_VALUE) map(set_rps_cpus_value,rps_cpus_list) map(set_rps_flow_value,rps_flow_list) def unset_rfs_rps(net_device): get_rfs_rps_file(net_device) def unset_rps_cpus_value(PATH): file_hander(PATH,RPS_RFS_DEFAULT) def unset_rps_flow_value(PATH): file_hander(PATH,RPS_RFS_DEFAULT) map(unset_rps_cpus_value,rps_cpus_list) map(unset_rps_flow_value,rps_flow_list) def set_irq_balance(): stop_irq_balance = 'service irqbalance stop' system(stop_irq_balance) interrupts_ct = open(interrupts_file) cores_nr = len(interrupts_ct.readline().split()) # 獲取CPU核心數 irq_bit = 0 while True: inter_line = interrupts_ct.readline() if inter_line == "": break js = inter_line.split() if len(js[-1]) > 5: if re.match(r'eth.-',js[-1][:5]): irq_nr = js[0][:-1] TARGET = '/proc/irq/%s/smp_affinity' %(irq_nr) VALUE = str(re.sub('0x','',hex(1 << irq_bit))) #1 << irq_bit 相對於2的N次方 ,hex() 二進制轉十六進制 file_hander(TARGET,VALUE) irq_bit += 1 if irq_bit == cores_nr: irq_bit = 0 def unset_irq_balance(): start_irq_balance = 'service irqbalance start' system(start_irq_balance) def usage(): usage = '''================================================= Description: irq_balance_set && rfs_rps_set tools Usage: <script> -i : set irq smp_affinity -I : unset irq smp_affinity -r : set rfs && rps -R : unset rfs && rps ''' print usage if __name__ == '__main__': parser = OptionParser() parser.add_option("-i", action="store_true", dest="irq_true", default=False) parser.add_option("-I", action="store_true", dest="irq_false", default=False) parser.add_option("-r", action="store_true", dest="rps_true", default=False) parser.add_option("-R", action="store_true", dest="rps_false", default=False) (options, args) = parser.parse_args() if options.irq_true == True: set_irq_balance() print "irq_balance_set successfully" elif options.irq_false == True: unset_irq_balance() print "unset irq balance successfully" elif options.rps_true == True: device_list = get_device() map(set_rfs_rps,device_list) print "rfs&&rps configured successfully" elif options.rps_false == True: device_list = get_device() map(unset_rfs_rps,device_list) print "unconfigured rfs&&rps successfully" else: usage()
加入到開機啓動中
#!/bin/bash CORE_SUM="`grep -c '^processor' /proc/cpuinfo`" IRQ_SUM="`echo "1 2 4 8 10 20 40 80 100 200 400 800 1000 2000 4000 8000 10000 20000 40000 80000 100000 200000 400000 800000"| cut -d " " -f -${CORE_SUM}`" IRQ_NUM="`echo ${IRQ_SUM}`" for i in `grep -E '(eth[0-9]+|em[0-9]+)' /proc/interrupts | awk -F ":" '{print $1}' | sed 's/\ //g'`; do echo -e "${i}\t:`cat /proc/irq/${i}/smp_affinity`" y="`echo ${IRQ_NUM} | awk '{print $1}'`" echo ${y} > /proc/irq/${i}/smp_affinity #echo "echo ${y} > /proc/irq/${i}/smp_affinity" if [ "${y}" == "`echo ${IRQ_SUM} | awk '{print $NF}'`" ]; then IRQ_NUM="`echo ${IRQ_SUM}`" else IRQ_NUM="`echo ${IRQ_NUM} | sed 's/^\([0-9]\+\)\ \(.*\)/\2/g'`" fi echo -e "----\t `cat /proc/irq/${i}/smp_affinity`" done ######Enable RPS (Receive Packet Steering) rfc=4096 cc=$(grep -c processor /proc/cpuinfo) rsfe=$(echo $cc*$rfc | bc) sysctl -w net.core.rps_sock_flow_entries=$rsfe for fileRps in $(ls /sys/class/net/eth*/queues/rx-*/rps_cpus) do echo fff > $fileRps done for fileRfc in $(ls /sys/class/net/eth*/queues/rx-*/rps_flow_cnt) do echo $rfc > $fileRfc done tail /sys/class/net/eth*/queues/rx-*/{rps_cpus,rps_flow_cnt}
建立用戶組
groupadd mysql useradd -g mysql -s /sbin/nologin -M mysql
安裝並建立數據目錄
yum install wget gcc gcc-c++ make cmake ncurses-devel libtool zilib-devel openssl openssl-devel numactl -y tar xf mysql-5.7.16-linux-glibc2.5-x86_64.tar.gz -C /usr/local ln -sv /usr/local/mysql-5.7.16-linux-glibc2.5-x86_64 /usr/local/mysql mkdir -p /data/mysql3306/{data,logs,tmp} chown -R mysql:mysql /data/mysql3306/ chown -R mysql:mysql /usr/local/mysql/
建立/etc/my.cnf
#my.cnf [client] port = 3306 socket = /data/mysql3306/data/mysql3306.sock [mysql] prompt="\\u@\\h:\\p [\\d]>" #pager="less -i -n -S" #tee=/data/mysql3306/query.log no-auto-rehash [mysqld] #misc user = mysql basedir = /usr/local/mysql datadir = /data/mysql3306/data port = 3306 socket = /data/mysql3306/tmp/mysql3306.sock event_scheduler = 0 tmpdir = /data/mysql3306/tmp #timeout interactive_timeout = 3600 wait_timeout = 3600 #character set character-set-server = utf8 open_files_limit = 65535 max_connections = 500 max_connect_errors = 100000 lower_case_table_names =1 #symi replication #rpl_semi_sync_master_enabled=1 #rpl_semi_sync_master_timeout=1000 # 1 second #rpl_semi_sync_slave_enabled=1 #logs log-output=file slow_query_log = 1 slow_query_log_file = slow.log log-error = error.log log_warnings = 2 pid-file = mysql.pid long_query_time = 1 #log-slow-admin-statements = 1 #log-queries-not-using-indexes = 1 log-slow-slave-statements = 1 #binlog #binlog_format = STATEMENT binlog_format = row server-id = 13306 log-bin = /data/mysql3306/logs/mysql-bin binlog_cache_size = 4M max_binlog_size = 256M max_binlog_cache_size = 1M sync_binlog = 0 expire_logs_days = 10 #procedure log_bin_trust_function_creators=1 # gtid-mode = on enforce-gtid-consistency=1 \#relay log skip_slave_start = 1 max_relay_log_size = 128M relay_log_purge = 1 relay_log_recovery = 1 relay-log=relay-bin relay-log-index=relay-bin.index log_slave_updates #slave-skip-errors=1032,1053,1062 #skip-grant-tables #buffers & cache table_open_cache = 2048 table_definition_cache = 2048 table_open_cache = 2048 max_heap_table_size = 96M sort_buffer_size = 128K join_buffer_size = 128K thread_cache_size = 200 query_cache_size = 0 query_cache_type = 0 query_cache_limit = 256K query_cache_min_res_unit = 512 thread_stack = 192K tmp_table_size = 96M key_buffer_size = 8M read_buffer_size = 2M read_rnd_buffer_size = 16M bulk_insert_buffer_size = 32M #myisam myisam_sort_buffer_size = 128M myisam_max_sort_file_size = 1G myisam_repair_threads = 1 #innodb innodb_buffer_pool_size = 10G innodb_buffer_pool_instances = 1 innodb_data_file_path = ibdata1:1024M:autoextend innodb_flush_log_at_trx_commit = 2 innodb_log_buffer_size = 8M innodb_log_file_size = 100M innodb_log_files_in_group = 3 innodb_max_dirty_pages_pct = 50 innodb_file_per_table = 1 innodb_rollback_on_timeout innodb_status_file = 1 innodb_io_capacity = 200 transaction_isolation = READ-COMMITTED innodb_flush_method = O_DIRECT
5.7初始化
cd /usr/local/mysql ./bin/mysqld --initialize #或者 ./bin/mysqld --initialize-insecure
5.7如下版本初始化
cd /usr/local/mysql ./scripts/mysql_install_db --defaults-file=/etc/my.cnf
安全加固
delete from mysql.user where user!='root' or host!='localhost'; truncate table mysql.db; drop database test; flush privileges; cat /data/mysql3306/logs/error.log |grep "password" 2016-11-30T13:28:37.276714Z 1 [Note] A temporary password is generated for root@localhost: 6fT?TYzJI*Dg
環境變量
echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/profile soure /etc/profile
開機自啓
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql chmod +x /etc/init.d/mysql chkconfig add mysql chkconfig mysql on