优化案例:缺少整体规划导致DB性能问题
最近几天对客户的一个核心数据库进行了优化,将资源消耗较高的SQL优化完成之后,物理读和逻辑读总量得到了降低。客户反馈优化后性能有提升,但仍然在某些工作日的业务高峰时段存在性能问题。 我们通过将性能不佳的业务高峰时段(即问题时段)与性能正常的业务
最近几天对客户的一个核心数据库进行了优化,将资源消耗较高的SQL优化完成之后,物理读和逻辑读总量得到了降低。客户反馈优化后性能有提升,但仍然在某些工作日的业务高峰时段存在性能问题。我们通过将性能不佳的业务高峰时段(即问题时段)与性能正常的业务高峰时段(即基线时段)的性能数据进行了对比,发现了一些问题:
基线时段为2014-1-15日上午8:00-上午9:00,此时段TPS(每秒事务量)为:46T/s,该时段的总DB Time为:626.2 (mins)
问题时段为2014-1-20日上午8:00-上午9:00,此时段TPS为:47T/s(仅比基线时段多1T/s,可认为两者业务量相当),该时段的总DB Time为2361.4 (mins)
同样均为1小时的取样时间段,问题段的总DB Time是基线的近4倍,而通过对比两者的性能视图,发现问题时段的单次IO延迟非常高,如下:
Event Waits Time(s) Avg wait (ms) % DB time Wait Class
DB CPU 2,082 55.42
db file sequential read 62,140 774 12 20.61 User I/O
direct path read 177,440 575 3 15.31 User I/O
log file sync 17,486 145 8 3.86 Commit
gc cr block 2-way 98,519 30 0 0.80 Cluster
基线时段单次序列读延时为12ms,单次直接读延时为3ms,单次redolog写延时为8ms,
Event Waits Time(s) Avg wait (ms) % DB time Wait Class
direct path read 180,200 4,643 26 32.77 User I/O
db file sequential read 55,483 2,286 41 16.13 User I/O
DB CPU 1,917 13.53
gc buffer busy acquire 5,513 1,474 267 10.40 Cluster
log file sync 17,541 1,298 74 9.16 Commit
而问题时段单次序列读延时为41ms,单次直接读延时为26ms,单次redolog写延时为74ms
(Oracle文档中建议的单次IO正常延时应为0-20ms,否则需升级硬件),
即相比基线时段,在业务量不变的情况下,问题时段的IO效率下降非常明显,怀疑是存储层面的同一个RAID组中有其他业务系统有可能恰好在问题时段有大量的IO操作,
导致我们正在优化的系统的IO延迟较大。跟客户的存储人员确认发现确实如此,存储人员并没有结合数据库对存储做出合理规划,仅仅从容量管理上对自己工作的方便性出发,划分并分配LUN。由此导致性能问题,我想这种问题在很多企业都是存在的,跨部门之间的沟通不畅导致没有从整体上的规划出现,最终出现问题由DB买单。
因此建议客户进行存储改善:
1.将这种关键系统在存储层面与其他系统隔离,避免互相影响IO;
2.有预算的情况下升级存储。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック











PHP の配列キー値の反転メソッドのパフォーマンスを比較すると、array_flip() 関数は、大規模な配列 (100 万要素以上) では for ループよりもパフォーマンスが良く、所要時間が短いことがわかります。キー値を手動で反転する for ループ方式は、比較的長い時間がかかります。

さまざまな Java フレームワークのパフォーマンス比較: REST API リクエスト処理: Vert.x が最高で、リクエスト レートは SpringBoot の 2 倍、Dropwizard の 3 倍です。データベース クエリ: SpringBoot の HibernateORM は Vert.x や Dropwizard の ORM よりも優れています。キャッシュ操作: Vert.x の Hazelcast クライアントは、SpringBoot や Dropwizard のキャッシュ メカニズムよりも優れています。適切なフレームワーク: アプリケーションの要件に応じて選択します。Vert.x は高パフォーマンスの Web サービスに適しており、SpringBoot はデータ集約型のアプリケーションに適しており、Dropwizard はマイクロサービス アーキテクチャに適しています。

時間計算量は、入力のサイズに対するアルゴリズムの実行時間を測定します。 C++ プログラムの時間の複雑さを軽減するためのヒントには、適切なコンテナー (ベクター、リストなど) を選択して、データのストレージと管理を最適化することが含まれます。クイックソートなどの効率的なアルゴリズムを利用して計算時間を短縮します。複数の操作を排除して二重カウントを削減します。条件分岐を使用して、不必要な計算を回避します。二分探索などのより高速なアルゴリズムを使用して線形探索を最適化します。

C++ マルチスレッドのパフォーマンスを最適化するための効果的な手法には、リソースの競合を避けるためにスレッドの数を制限することが含まれます。競合を軽減するには、軽量のミューテックス ロックを使用します。ロックの範囲を最適化し、待ち時間を最小限に抑えます。ロックフリーのデータ構造を使用して同時実行性を向上させます。ビジー待機を回避し、イベントを通じてリソースの可用性をスレッドに通知します。

PHP では、配列からオブジェクトへの変換はパフォーマンスに影響を与え、主に配列のサイズ、複雑さ、オブジェクト クラスなどの要因によって影響を受けます。パフォーマンスを最適化するには、カスタム反復子の使用、不必要な変換の回避、配列のバッチ変換などの手法を検討してください。

Go で乱数を生成する最適な方法は、アプリケーションに必要なセキュリティのレベルによって異なります。低セキュリティ: math/rand パッケージを使用して、ほとんどのアプリケーションに適した疑似乱数を生成します。高いセキュリティ: crypto/rand パッケージを使用して、より強力なランダム性を必要とするアプリケーションに適した、暗号的に安全なランダム バイトを生成します。

PHP 関数の効率を最適化する 5 つの方法: 変数の不必要なコピーを避ける。参照を使用して変数のコピーを回避します。繰り返しの関数呼び出しを避けてください。単純な関数をインライン化します。配列を使用したループの最適化。

ベンチマークによると、小規模で高性能なアプリケーションの場合、Quarkus (高速起動、低メモリ) または Micronaut (TechEmpower に優れた) が理想的な選択肢です。 SpringBoot は大規模なフルスタック アプリケーションに適していますが、起動時間とメモリ使用量が若干遅くなります。
