ホームページ データベース mysql チュートリアル Linux での mysql 最適化の 3 つの柱 - CPU、メモリ、ファイル システム

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

Nov 25, 2016 pm 03:38 PM
cpu linux mysql メモリ ファイルシステム

現在、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。


このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

MySQLの役割:Webアプリケーションのデータベース MySQLの役割:Webアプリケーションのデータベース Apr 17, 2025 am 12:23 AM

WebアプリケーションにおけるMySQLの主な役割は、データを保存および管理することです。 1.MYSQLは、ユーザー情報、製品カタログ、トランザクションレコード、その他のデータを効率的に処理します。 2。SQLクエリを介して、開発者はデータベースから情報を抽出して動的なコンテンツを生成できます。 3.MYSQLは、クライアントサーバーモデルに基づいて機能し、許容可能なクエリ速度を確保します。

Laravelは紹介例 Laravelは紹介例 Apr 18, 2025 pm 12:45 PM

Laravelは、Webアプリケーションを簡単に構築するためのPHPフレームワークです。次のような強力な機能を提供します。インストール:Laravel CLIを作曲家にグローバルにインストールし、プロジェクトディレクトリにアプリケーションを作成します。ルーティング:ルート/web.phpのURLとハンドラーの関係を定義します。ビュー:リソース/ビューでビューを作成して、アプリケーションのインターフェイスをレンダリングします。データベース統合:MySQLなどのデータベースとのすぐ外側の統合を提供し、移行を使用してテーブルを作成および変更します。モデルとコントローラー:モデルはデータベースエンティティを表し、コントローラーはHTTP要求を処理します。

Apr 16, 2025 pm 07:39 PM

NotePadはJavaコードを直接実行することはできませんが、他のツールを使用することで実現できます。コマンドラインコンパイラ(Javac)を使用してByteCodeファイル(filename.class)を生成します。 Javaインタープリター(Java)を使用して、バイトコードを解釈し、コードを実行し、結果を出力します。

データベース接続の解決問題:Minii/DBライブラリを使用する実用的なケース データベース接続の解決問題:Minii/DBライブラリを使用する実用的なケース Apr 18, 2025 am 07:09 AM

小さなアプリケーションを開発する際には、軽量データベース操作ライブラリをすばやく統合する必要性という厄介な問題に遭遇しました。複数のライブラリを試した後、私はそれらがあまりにも多くの機能を持っているか、あまり互換性がないかのどちらかであることがわかりました。最終的に、私は問題を完全に解決したYii2に基づいた単純化されたバージョンであるMinii/DBを見つけました。

Linuxアーキテクチャ:5つの基本コンポーネントを発表します Linuxアーキテクチャ:5つの基本コンポーネントを発表します Apr 20, 2025 am 12:04 AM

Linuxシステムの5つの基本コンポーネントは次のとおりです。1。Kernel、2。Systemライブラリ、3。Systemユーティリティ、4。グラフィカルユーザーインターフェイス、5。アプリケーション。カーネルはハードウェアリソースを管理し、システムライブラリは事前コンパイルされた機能を提供し、システムユーティリティはシステム管理に使用され、GUIは視覚的な相互作用を提供し、アプリケーションはこれらのコンポーネントを使用して機能を実装します。

GITの倉庫アドレスを確認する方法 GITの倉庫アドレスを確認する方法 Apr 17, 2025 pm 01:54 PM

gitリポジトリアドレスを表示するには、次の手順を実行します。1。コマンドラインを開き、リポジトリディレクトリに移動します。 2。「git remote -v」コマンドを実行します。 3.出力と対応するアドレスでリポジトリ名を表示します。

Laravelインストールコード Laravelインストールコード Apr 18, 2025 pm 12:30 PM

Laravelをインストールするには、これらの手順を順番に進みます。コンポーザー(MacOS/LinuxとWindows用)インストールLaravelインストーラーをインストールします。

Laravel Frameworkインストール方法 Laravel Frameworkインストール方法 Apr 18, 2025 pm 12:54 PM

記事の概要:この記事では、Laravelフレームワークを簡単にインストールする方法について読者をガイドするための詳細なステップバイステップの指示を提供します。 Laravelは、Webアプリケーションの開発プロセスを高速化する強力なPHPフレームワークです。このチュートリアルは、システム要件からデータベースの構成とルーティングの設定までのインストールプロセスをカバーしています。これらの手順に従うことにより、読者はLaravelプロジェクトのための強固な基盤を迅速かつ効率的に築くことができます。

See all articles