写真の配垃を加速したす



すべおのシステム管理者は、遅かれ早かれ、静的コンテンツの戻りが遅いずいう問題に盎面しおいたす。



これは、おおよそ次のように珟れたす。3Mb、css、JavaScriptの重さのように3Kbの画像が読み蟌たれ、JavaScriptが青から「固執」非垞にゆっくりずし始めたす。 ctrl + reloadを抌すず、問題はないず思われたすが、数分埌にはすべおが再び繰り返されたす。



「ブレヌキ」の真の理由は必ずしも明らかではなく、nginx、ホスティング事業者、「詰たった」チャネル、たたは「ブレヌキ」たたは「バギヌ」ブラりザを芋たす:)



実際、問題は、スピンドルの回転ずヘッドの䜍眮決めの機械的サブシステムにただ加わっおいない最新のハヌドドラむブの欠陥です。



この蚘事では、nginx WebサヌバヌでSSDドラむブを䜿甚した実際の経隓に基づいお、この問題に察する私の゜リュヌションを提䟛したす。





そのハヌドブレヌキを理解する方法は



Linuxでは、ディスクシステムの速床の問題は、 iowaitパラメヌタヌI / Oを埅機しおいるCPUアむドルの割合に盎接関連しおいたす。 このパラメヌタを監芖するために、いく぀かのコマンドがありたす mpstat 、 iostat 、 sar 。 私は通垞iostat 5を起動したす枬定は5秒ごずに行われたす。

平均iowaitが最倧0.5のサヌバヌに぀いおは冷静です。 「配垃」のサヌバヌでは、このパラメヌタヌが高くなる可胜性がありたす。 iowait> 10の堎合、最適化を遅らせないこずは理にかなっおいたす。システムは、情報を読み取るのではなく、ハヌドドラむブ䞊でヘッドを移動するのに倚くの時間を費やしたす。



倧きなiowaitをどうするか



明らかに、ディスクI / Oの数を枛らすず、ハヌドドラむブが簡単に動き出し、iowaitが萜ちたす。

以䞋にいく぀かの提案を瀺したす。



これは少し助けになり、アップグレヌドたで埅぀時間を䞎えたす。 プロゞェクトが成長しおいる堎合、 iowaitは間もなくそのこずを思い出したす。 :)



アップグレヌドアむアン





CPUのアップグレヌドは「枛速」しないため、配垃速床にはたったく圱響したせん。 :)



なぜSSD



1幎半前、蚘事「Tuning nginx」を曞いたずき、nginxを高速化するためのオプションの1぀は、ハヌドドラむブのSSDを䜿甚するこずでした。 habrasocietyはこのテクノロゞヌぞの関心を控えめに瀺したした。SSDの経時的なブレヌキの可胜性ず、少数の曞き換えサむクルに察する恐怖に぀いおの情報がありたした。

その蚘事の公開埌たもなく、Kingston SNE125-S2 / 64GBがIntel x25e SSDに基づいお圓瀟に登堎したした。これは、今日でも最も負荷の高い「ディストリビュヌション」サヌバヌの1぀で䜿甚されおいたす。



1幎の実隓の埌、いく぀かの欠点が珟れたした。それに぀いおお話ししたいず思いたす。

SSDを䜿甚する理由



SSDキャッシュを構成する



ファむルシステムの遞択

実隓の開始時に、ext4はKingston SNE125-S2 / 64GBにむンストヌルされたした。 むンタヌネットでは、ログの「切り取り」方法、ファむルぞの最埌のアクセス日などに関する倚くの掚奚事項がありたす。 すべおが完璧に、そしお長い間機胜しおいたした。 最も重芁なこずは、64G SSDに1〜5Kの倚数の小さな写真があり、半分以䞋のサむズである-20G未満であるずいうこずです。 SSDが合理的に䜿甚されおいないのではないかず疑い始めたした。



カヌネルを2.6.35にアップグレヌドし、ただ実隓的なbtrfsを詊しおみるこずにしたした。そのssdがマりントされおいるこずを瀺す機䌚がありたす。 ディスクは通垞のようにパヌティションに分割するこずはできたせんが、党䜓ずしおフォヌマットされたす。



䟋

mkfs.btrfs /dev/sdb
      
      





マりントするずきに、必芁のない倚くの機胜を無効にし、ファむルずメタデヌタの圧瞮を有効にするこずができたす。 実際、jpegは圧瞮されず、btrfsはスマヌトであり、メタデヌタのみが圧瞮されたす。 これはfstabの私のマりント行がどのように芋えるかですすべお1行で



UUID = 7db90cb2-8a57-42e3-86bc-013cc0bcb30e / var / www / ssd btrfs device = / dev / sdb、device = / dev / sdc、device = / dev / sdd、noatime、ssd、nobarrier、compress、nodatacow、nodatasum 、noacl、notreelog 1 2



コマンドを䜿甚しお、フォヌマットされたディスクのUUIDを芋぀けるこずができたす

 blkid /dev/sdb
      
      







その結果、41G以䞊がディスクに「クラむミング」されたしたext4の2倍。 同時に、配垃速床は䜎䞋したせんでしたiowaitが増加しなかったため。



SSDからRAIDを収集したす

64G SSDが小さくなった瞬間、耇数のSSDを1぀の倧きなパヌティションにたずめたいず同時に、高䟡なSLCだけでなく、通垞のMLC SSDも䜿甚したかったのです。 ここで、少し理論を挿入する必芁がありたす。



Btrfsはディスク䞊に3皮類のデヌタを保存したす。ファむルシステム自䜓に関するデヌタ、メタデヌタブロックのアドレス垞にディスク䞊にはメタデヌタのコピヌが2぀ありたす、そしお実際にはデヌタ自䜓ファむルコンテンツです。 実隓的に、ディレクトリ構造内の「圧瞮された」メタデヌタは、セクション内のすべおのデヌタの玄30を占めるこずがわかりたした。 メタデヌタは最も集䞭的に倉曎されたブロックです。なぜなら、 ファむルの远加、ファむル転送、アクセス暩の倉曎は、メタデヌタブロックの䞊曞きを䌎いたす。 デヌタが単玔に保存される領域は、あたり頻繁に䞊曞きされたせん。 そこで、btrfsの最も興味深い機胜を玹介したす。゜フトりェアRAIDアレむを䜜成し、どのディスクにどのメタデヌタにデヌタを保存するかを明瀺的に瀺すこずです。



䟋

 mkfs.btrfs -m single /dev/sdc -d raid0 /dev/sdb /dev/sdd
      
      





その結果、メタデヌタは/ dev / sdcに䜜成され、デヌタは/ dev / sdbおよび/ dev / sddに䜜成され、ストリップされたraidで収集されたす。 さらに、 より倚くのディスクを既存のシステムに接続したり、デヌタバランシングを実行したりできたす。



UUID btrfs RAIDを確認するには、次を実行したす。

 btrfs device scan
      
      





泚意btrfs-rideを䜿甚する特殊性各RAIDアレむをマりントする前、およびbtrfsモゞュヌルをロヌドした埌、コマンドbtrfs device scanを実行する必芁がありたす。 fstabによる自動マりントの堎合、 デバむスオプションをマりント行に远加するこずにより、「btrfsデバむススキャン」なしで実行できたす。 䟋

 /dev/sdb /mnt btrfs device=/dev/sdb,device=/dev/sdc,device=/dev/sdd,device=/dev/sde
      
      







proxy_cacheを䜿甚しないnginxでのキャッシュ



すべおのコンテンツが栌玍されおいるストレヌゞサヌバヌ、倚くのスペヌス、および共有アクセスの倧きな負荷を保持できない通垞の「䜎速」SATAハヌドドラむブがあるず仮定したす。

ストレヌゞサヌバヌずサむトのナヌザヌの間に「配垃」サヌバヌがあり、そのタスクは、ストレヌゞサヌバヌから負荷を取り陀き、任意の数のクラむアントぞの静的な䞭断のない「配垃」を確保するこずです。



ディストリビュヌションサヌバヌのボヌドにbtrfsを䜿甚しお1぀以䞊のSSDをむンストヌルしたす。 これは、proxy_cacheに基づいおnginx蚭定を盎接芁求したす。 しかし、私たちのシステムにはいく぀かの欠点がありたす。



キャッシングには別のアプロヌチを取りたす。 hiload䌚議の1぀でアむデアが閃きたした。 キャッシュセクション2にcache0およびcache1ディレクトリを䜜成したす。 すべおのプロキシファむルはcache0に保存されたすproxy_storeを䜿甚。 nginxは、最初にcache0で、次にcache1でファむルの可甚性を確認しファむルをクラむアントに提䟛したす、ファむルが芋぀からない堎合はファむルのストレヌゞサヌバヌに移動しお、cache0に保存したす。

しばらくしおから週/月/四半期、cache1を削陀し、cache0の名前をcache1に倉曎し、空のcache0を䜜成したす。 cache1セクションぞのアクセスログを分析し、このセクションから芁求されたファむルをcache0にリンクしたす。



この方法により、SSDの曞き蟌み操䜜を倧幅に削枛できたす。 ファむルの再リンクは、ファむルを完党に曞き換えるよりもただ少ないです。 さらに、耇数のSSDからRAIDを収集できたす。そのうちの1぀は、メタデヌタ甚のSLCず通垞デヌタ甚のMLC SSDです。 私たちのシステムでは、メタデヌタは総デヌタ量の玄30を占めおいたす 。 リンクするず、メタデヌタのみが䞊曞きされたす



Nginxの構成䟋

 log_format cache0 '$request'; # ... server { expires max; location / { root /var/www/ssd/cache0/ ; try_files $uri @cache1; access_log off; } location @cache1 { root /var/www/ssd/cache1; try_files $uri @storage; access_log /var/www/log_nginx/img_access.log cache0; } location @storage { proxy_pass http://10.1.1.1:8080/$request_uri; proxy_store on; proxy_store_access user:rw group:rw all:r; proxy_temp_path /var/www/img_temp/; #    SSD! root /var/www/ssd/cache0/; access_log off; } # ...
      
      







cache0およびcache1ロヌテヌションのスクリプト

以前に説明したロヌテヌションスキヌムを実装するのに圹立぀いく぀かのスクリプトをbashで䜜成したした 。 キャッシュのサむズが数癟ギガバむト単䜍で枬定され、キャッシュ内のコンテンツの量が数癟䞇単䜍である堎合、次のコマンドで数回ロヌテヌションした盎埌にria_ssd_cache_mover.shスクリプトを実行するこずをお勧めしたす。

 for i in `seq 1 10`; do ria_ssd_cache_mover.sh; done;
      
      



このコマンドを実隓的に実行する時間を蚭定したす。 圌女は私のためにほが䞀日働いた。 次は 毎日、cronでria_ssd_cache_mover.shの起動を1時間ごずに蚭定したす。



DOSストレヌゞサヌバヌに察する保護

ストレヌゞサヌバヌが匱く、システムを絞めようずする悪意のある人がいる堎合、前述の゜リュヌションず䞀緒にsecure_linkモゞュヌルを䜿甚できたす



䟿利なリンク







UPD1それにもかかわらず、カヌネルを䜿甚するこずをお勧めしたす> = 2.6.37以前。 最近、メタデヌタを含むSSDのスペヌスオヌバヌフロヌが原因で2.6.35で倧きなキャッシュクラッシュが発生したした。 その結果、゚むリアンは耇数のSSDをフォヌマットし、btrfs raidを再構築したす。 :(






All Articles