Maison  >  Article  >  base de données  >  Conseils pour optimiser MySQL sous Linux

Conseils pour optimiser MySQL sous Linux

小云云
小云云original
2017-11-18 13:33:001324parcourir

Aujourd'hui, quel que soit le développement que nous effectuons, nous devons prêter attention à une efficacité élevée. Lors du développement, vous ne faites pas seulement attention à votre technologie, parfois l'optimisation de certaines fonctions améliorera également votre efficacité au travail. De nos jours, la plupart des environnements sur lesquels MySQL s'exécute sont sous Linux. Voici quelques stratégies générales et simples sur la façon d'optimiser MySQL sur le système d'exploitation Linux. Ces méthodes contribuent toutes à améliorer les performances de MySQL.

1. CPU

Commençons par le CPU.
Si vous vérifiez bien, il y a un phénomène intéressant sur certains serveurs : lorsque vous cat /proc/cpuinfo, vous constaterez que la fréquence CPU est différente de sa fréquence nominale :

#cat /proc/cpuinfo      processor : 5     model name : Intel(R) Xeon(R) CPU E5-2620 0 @2.00GHz ...     cpu MHz : 1200.000

C'est le processeur Intel E5-2620, qui est un processeur 2,00G * 24. Cependant, nous avons constaté que la fréquence du cinquième processeur est de 1,2G.
Quelle en est la raison ?
Ceux-ci sont en fait dérivés de la dernière technologie de CPU : le mode économie d'énergie. Le système d'exploitation coopère avec le matériel du processeur. Lorsque le système n'est pas occupé, afin d'économiser de l'énergie et de réduire la température, il réduira la fréquence du processeur. C'est une aubaine pour les écologistes et la lutte contre le réchauffement climatique, mais pour MySQL, cela pourrait être un désastre.
Afin de garantir que MySQL puisse utiliser pleinement les ressources du processeur, il est recommandé de définir le processeur en mode de performances maximales. Ce paramètre peut être défini dans le BIOS et le système d'exploitation. Bien entendu, il est préférable et plus approfondi de définir cette option dans le BIOS. En raison des différences entre les différents types de BIOS, le réglage du processeur en mode de performances maximales varie considérablement, nous ne vous montrerons donc pas comment le configurer ici.

2. Mémoire

Ensuite, regardons la mémoire et voyons ce que nous pouvons optimiser.

i) Jetons d'abord un coup d'œil à numa
Non-Uniform Memory Access (NUMA : Non-Uniform Memory Access) est également la dernière technologie de gestion de la mémoire. Elle correspond à l'architecture multi-processeur symétrique (SMP : Symmetric Multi-Processor). Le classement simple des équipes est le suivant :

Conseils pour optimiser MySQL sous Linux


Comme le montre la figure, nous n'introduireons pas ici les informations détaillées de la NUMA. Mais nous pouvons intuitivement voir que le coût de l'accès SMP à la mémoire est le même ; mais dans l'architecture NUMA, le coût de l'accès à la mémoire locale et de l'accès à la mémoire non locale sont différents. En conséquence, sur la base de cette fonctionnalité, sur le système d'exploitation, nous pouvons définir la méthode d'allocation de mémoire du processus. Les méthodes actuellement prises en charge incluent :

--interleave=nodes   --membind=nodes   --cpunodebind=nodes   --physcpubind=cpus   --localalloc   --preferred=node

En bref, vous pouvez spécifier que la mémoire est allouée localement, allouée sur certains nœuds CPU ou allouée lors d'une interrogation. À moins que le mode d'allocation d'interrogation --interleave=nodes ne soit défini, la mémoire peut être allouée sur n'importe quel nœud NUMA. D'une autre manière, même s'il reste de la mémoire sur d'autres nœuds NUMA, Linux n'allouera pas la mémoire restante à ce processus, mais utilisera SWAP pour obtenir de la mémoire. Les administrateurs système ou administrateurs de base de données expérimentés savent tous à quel point la dégradation des performances des bases de données provoquée par SWAP peut être destructrice.
Le moyen le plus simple est donc de désactiver cette fonctionnalité.
Les méthodes pour désactiver la fonctionnalité incluent : vous pouvez désactiver temporairement cette fonctionnalité à partir du BIOS, du système d'exploitation ou lors du démarrage du processus.
a) En raison des différences entre les différents types de BIOS, la manière de désactiver NUMA varie considérablement, nous ne vous montrerons donc pas comment le configurer ici.
b) Pour le désactiver dans le système d'exploitation, vous pouvez directement ajouter numa=off à la fin de la ligne du noyau dans /etc/grub.conf, comme indiqué ci-dessous :

kernel /vmlinuz-2.6.32-220.el6.x86_64 ro root=/dev/mapper/VolGroup-root rd_NO_LUKS.UTF-8 rd_LVM_LV=VolGroup/root rd_NO_MD quiet
SYSFONT=latarcyrheb-sun16 
rhgb crashkernel=auto rd_LVM_LV=VolGroup/swap rhgb crashkernel=auto quiet KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM  numa=off

Dans De plus, vous pouvez définir vm.zone_reclaim_mode=0 Essayez de récupérer de la mémoire autant que possible.
c) Au démarrage de MySQL, désactivez la fonctionnalité NUMA :
numactl --interleave=all mysqld &

Bien sûr, le meilleur moyen est de la désactiver dans le BIOS.

ii) Regardons à nouveau vm.swappiness.

vm.swappiness est la stratégie du système d'exploitation pour contrôler l'échange de mémoire physique. Les valeurs autorisées sont un pourcentage, avec un minimum de 0 et un maximum de 100. La valeur par défaut est 60. Définir vm.swappiness sur 0 signifie échanger le moins possible, et 100 signifie échanger autant que possible les pages de mémoire inactives.
Pour être précis : lorsque la mémoire est pratiquement pleine, le système utilisera ce paramètre pour déterminer s'il doit remplacer la mémoire inactive rarement utilisée dans la mémoire ou libérer le cache de données. Le cache met en cache les données lues sur le disque. Selon le principe de localité du programme, ces données peuvent être relues ultérieurement ; la mémoire inactive, comme son nom l'indique, est celle qui est mappée par l'application mais non utilisée pour un " longtemps" Mémoire.
Nous pouvons utiliser vmstat pour voir la quantité de mémoire inactive :

#vmstat -an 1   procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
   r b swpd free  inact  active si so bi bo in cs us sy id wa st   1 0 0 27522384 326928 1704644 0 0 0 153 11 10 0 0 100 0 0  
    0 0 0 27523300 326936 1704164 0 0 0 74 784 590 0 0 100 0 0   0 0 0 27523656 326936 1704692 0 0 8 8 439 1686 0 0 100 0 0  
     0 0 0 27524300 326916 1703412 0 0 4 52 198 262 0 0 100 0 0

Vous pouvez voir des informations plus détaillées via /proc/meminfo :

#cat /proc/meminfo | grep -i inact   Inactive: 326972 kB   Inactive(anon): 248 kB   Inactive(file): 326724 kB

这里我们对不活跃inactive内存进一步深入讨论。Linux中,内存可能处于三种状态:free,active和inactive。众所周 知,Linux Kernel在内部维护了很多LRU列表用来管理内存,比如LRU_INACTIVE_ANON, LRU_ACTIVE_ANON, LRU_INACTIVE_FILE , LRU_ACTIVE_FILE, LRU_UNEVICTABLE。其中LRU_INACTIVE_ANON, LRU_ACTIVE_ANON用来管理匿名页,LRU_INACTIVE_FILE , LRU_ACTIVE_FILE用来管理page caches页缓存。系统内核会根据内存页的访问情况,不定时的将活跃active内存被移到inactive列表中,这些inactive的内存可以被 交换到swap中去。 
一般来说,MySQL,特别是InnoDB管理内存缓存,它占用的内存比较多,不经常访问的内存也会不少,这些内存如果被Linux错误的交换出去了,将 浪费很多CPU和IO资源。 InnoDB自己管理缓存,cache的文件数据来说占用了内存,对InnoDB几乎没有任何好处。 
所以,我们在MySQL的服务器上最好设置vm.swappiness=0。

我们可以通过在sysctl.conf中添加一行: 

echo "vm.swappiness = 0" >>/etc/sysctl.conf

并使用sysctl -p来使得该参数生效。

三、文件系统

最后,我们看一下文件系统的优化 
i)我们建议在文件系统的mount参数上加上noatime,nobarrier两个选项。

用noatime mount的话,文件系统在程序访问对应的文件或者文件夹时,不会更新对应的access time。一般来说,Linux会给文件记录了三个时间,change time, modify time和access time。 
我们可以通过stat来查看文件的三个时间: 

stat libnids-1.16.tar.gz   File: `libnids-1.16.tar.gz'   Size: 72309 Blocks: 152 IO Block: 4096 regular file 
  Device: 302h/770d Inode: 4113144 Links: 1   Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)  
  Access  : 2008-05-27 15:13:03.000000000 +0800   Modify: 2004-03-10 12:25:09.000000000 +0800  
   Change: 2008-05-27 14:18:18.000000000 +0800

其中access time指文件最后一次被读取的时间,modify time指的是文件的文本内容最后发生变化的时间,change time指的是文件的inode最后发生变化(比如位置、用户属性、组属性等)的时间。一般来说,文件都是读多写少,而且我们也很少关心某一个文件最近什 么时间被访问了。 
所以,我们建议采用noatime选项,这样文件系统不记录access time,避免浪费资源。 
现在的很多文件系统会在数据提交时强制底层设备刷新cache,避免数据丢失,称之为write barriers。但是,其实我们数据库服务器底层存储设备要么采用RAID卡,RAID卡本身的电池可以掉电保护;要么采用Flash卡,它也有自我保 护机制,保证数据不会丢失。所以我们可以安全的使用nobarrier挂载文件系统。设置方法如下: 
对于ext3, ext4和 reiserfs文件系统可以在mount时指定barrier=0;对于xfs可以指定nobarrier选项。

ii)文件系统上还有一个提高IO的优化*,那就是deadline。

在Flash技术之前,我们都是使用机械磁盘存储数据的,机械磁盘的寻道时间是影响它速度的最重要因素,直接导致它的每秒可做的IO(IOPS)非常有 限,为了尽量排序和合并多个请求,以达到一次寻道能够满足多次IO请求的目的,Linux文件系统设计了多种IO调度策略,已适用各种场景和存储设备。 
Linux的IO调度策略包括:Deadline scheduler,Anticipatory scheduler,Completely Fair Queuing(CFQ),NOOP。每种调度策略的详细调度方式我们这里不详细描述,这里我们主要介绍CFQ和Deadline,CFQ是Linux内 核2.6.18之后的默认调度策略,它声称对每一个 IO 请求都是公平的,这种调度策略对大部分应用都是适用的。但是如果数据库有两个请求,一个请求3次IO,一个请求10000次IO,由于绝对公平,3次IO 的这个请求都需要跟其他10000个IO请求竞争,可能要等待上千个IO完成才能返回,导致它的响应时间非常慢。并且如果在处理的过程中,又有很多IO请 求陆续发送过来,部分IO请求甚至可能一直无法得到调度被“饿死”。而deadline兼顾到一个请求不会在队列中等待太久导致饿死,对数据库这种应用来 说更加适用。 
实时设置,我们可以通过 

echo deadline >/sys/block/sda/queue/scheduler

来将sda的调度策略设置为deadline。

我们也可以直接在/etc/grub.conf的kernel行最后添加elevator=deadline来永久生效。

总结 

CPU方面 
    关闭电源保护模式

内存: 
    vm.swappiness = 0 
    关闭numa

文件系统: 
    用noatime,nobarrier挂载系统 
    IO调度策略修改为deadline。

MySQL优化的方式很多,优化之后你的工作效率也会大大的提升,希望本文对你有用。

相关推荐:

分享一篇mysql优化的实例

Mysql优化的方向与目的

Introduction détaillée sur la façon d'optimiser MySQL sous Linux

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn