Linux での mysql 最適化の 3 つの柱 - CPU、メモリ、ファイル システム

伊谢尔伦
リリース: 2016-11-25 15:38:51
オリジナル
1288 人が閲覧しました

現在、MySQL が実行される環境のほとんどは Linux 上にあります。Linux オペレーティング システム上で MySQL を最適化する方法として、一般的で簡単な戦略がいくつかあります。これらの方法はすべて、MySQL のパフォーマンスの向上に役立ちます。

おしゃべりはやめて、本題に入りましょう。

1. CPU

CPUから始めましょう。
注意深くチェックすると、一部のサーバーで興味深い現象が発生します。/proc/cpuinfo を実行すると、CPU 周波数が公称周波数と異なることがわかります:

#cat /proc/cpuinfo 
 processor : 5
 model name : Intel(R) Xeon(R) CPU E5-2620 0 @2.00GHz
 ...
 cpu MHz : 1200.000
ログイン後にコピー

これは Intel E5-2620 CPU です。 2.00G * 24 CPU ですが、5 番目の CPU の周波数は 1.2G であることがわかりました。

その理由は何ですか?

これらは実際には、CPU の最新テクノロジーである省エネモードから派生したものです。オペレーティング システムは、CPU ハードウェアと連携して、システムがビジー状態ではない場合、電力を節約し、温度を下げるために CPU の周波数を下げます。これは環境活動家や地球温暖化との戦いにとっては恩恵ですが、MySQL にとっては大惨事になる可能性があります。
MySQL が CPU リソースを最大限に活用できるようにするには、CPU を最大パフォーマンス モードに設定することをお勧めします。もちろん、この設定は BIOS とオペレーティング システムで設定できます。BIOS でこのオプションを設定する方がより適切でより完全です。さまざまな BIOS タイプの違いにより、CPU を最大パフォーマンス モードに設定する方法は大きく異なるため、ここでは設定方法については説明しません。

2. メモリ

次に、メモリを見て、何を最適化できるかを見てみましょう。

i) まず uma について見てみましょう

Non-Uniform Memory Access Structure (NUMA: Non-Uniform Memory Access) も最新のメモリ管理テクノロジです。対称型マルチプロセッサアーキテクチャ(SMP:Symmetric Multi-Processor)に対応しています。

SMP によるメモリへのアクセスのコストは同じですが、NUMA アーキテクチャでは、ローカル メモリ アクセスと非ローカル メモリ アクセスのコストは異なります。これに応じて、この機能に基づいて、オペレーティング システム上でプロセスのメモリ割り当て方法を設定できます。現在サポートされている方法は次のとおりです:

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

つまり、メモリの場所を指定できます ローカル割り当て、割り当て特定の CPU ノードまたはポーリング割り当てで。 –interleave=nodes ポーリング割り当てモードが設定されていない限り、メモリは任意の NUMA ノードに割り当てることができます。別の方法では、他の NUMA ノードにメモリが残っている場合でも、Linux は残りのメモリをこのプロセスに割り当てず、SWAP を使用してメモリを取得します。経験豊富なシステム管理者や DBA は、SWAP によってデータベースのパフォーマンスがどれほど破壊的に低下するかを知っています。
したがって、最も簡単な方法は、この機能をオフにすることです。
この機能をオフにする方法は次のとおりです: BIOS、オペレーティング システムから、またはプロセスの開始時にこの機能を一時的にオフにすることができます。
a) さまざまな BIOS タイプの違いにより、NUMA をオフにする方法は大きく異なるため、ここでは設定方法については説明しません。
b) オペレーティング システムでこれをオフにするには、以下に示すように、/etc/grub.conf のカーネル行の末尾に uma=off を直接追加できます。

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
ログイン後にコピー

さらに、vm.zone_reclaim_mode を設定することもできます。 =0 メモリの再利用を試みます。
c) MySQL を起動するときは、NUMA 機能をオフにします:

numactl --interleave=all  mysqld &
ログイン後にコピー

もちろん、最善の方法は BIOS でオフにすることです。

ii) vm.swappiness をもう一度見てみましょう。

vm.swappiness は、物理メモリのスワッピングを制御するためのオペレーティング システムの戦略です。許可される値はパーセンテージで、最小値は 0、最大値は 100 です。値のデフォルトは 60 です。 vm.swappiness を 0 に設定すると、スワップができるだけ少なくなり、100 に設定すると、非アクティブなメモリ ページができるだけスワップアウトされます。
具体的には: メモリが基本的にいっぱいの場合、システムはこのパラメータを使用して、メモリ内でめったに使用されない非アクティブなメモリをスワップアウトするか、データ キャッシュを解放するかを決定します。キャッシュは、ディスクから読み取られたデータをキャッシュします。プログラムの局所性の原則に従って、これらのデータは次に再度読み取られる可能性があります。非アクティブなメモリは、その名前が示すように、アプリケーションによってマップされているものの、「長期間使用されない」データです。 " メモリ。
vmstat を使用して、非アクティブなメモリの量を確認できます:

#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
ログイン後にコピー

/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。


ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!