最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL生產(chǎn)環(huán)境CPU使用率過高的排查與解決方案

 更新時間:2024年03月19日 11:20:31   作者:lucky_fd_  
在生產(chǎn)環(huán)境中,MySQL作為一個關鍵的數(shù)據(jù)庫組件,其性能對整個系統(tǒng)的穩(wěn)定性至關重要,有時候我們可能會遇到MySQL CPU使用率過高的問題,本文將詳細介紹如何排查和解決MySQL CPU過高的問題,幫助您迅速恢復正常的數(shù)據(jù)庫性能,需要的朋友可以參考下

引言

在生產(chǎn)環(huán)境中,MySQL作為一個關鍵的數(shù)據(jù)庫組件,其性能對整個系統(tǒng)的穩(wěn)定性至關重要。然而,有時候我們可能會遇到MySQL CPU使用率過高的問題,這可能導致系統(tǒng)性能下降,應用頁面訪問減慢,甚至影響到用戶體驗。本文將詳細介紹如何排查和解決MySQL CPU過高的問題,幫助您迅速恢復正常的數(shù)據(jù)庫性能。

首先我們要明白什么是CPU使用率:

CPU使用率是指在單位時間內(nèi)CPU處于非空閑狀態(tài)的時間比,反映了CPU的繁忙程度。某個進程的CPU使用率就是這個進程在一段時間內(nèi)占用的CPU時間占總的時間的百分比。比如在雙核CPU某個開啟多線程的進程1s內(nèi)占用了CPU0 0.6s, CPU1 0.9s, 那么它的占用率是150%。這里不深入闡述,網(wǎng)上文章很多。

CPU占用過高原因分析

CPU 占用過高常見原因:

  • 服務器硬件問題
  • 內(nèi)存溢出
  • 高并發(fā)業(yè)務中業(yè)務設計不合理導致
    • 數(shù)據(jù)庫對象設計不合理
    • 表索引設計不合理
    • 數(shù)據(jù)庫鎖導致,如行鎖沖突、行鎖等待、鎖超時、死鎖等
    • 系統(tǒng)架構沒有緩存中間件
    • 讀寫分離配置不合理
    • 未合理升級改造為集群環(huán)境
    • MySQL 系統(tǒng)參數(shù)設置不合理
    • 問題 SQL 導致

SQL 問題導致 CPU 使用率過高是最常見的現(xiàn)象,比如 group by、order by、join 等,這些很大程度影響 SQL 執(zhí)行效率,從而占用大量的系統(tǒng)資源。

說了這么多常見原因,其實總結一句話來說就是現(xiàn)有系統(tǒng)的現(xiàn)有配置下的現(xiàn)有環(huán)境提供不了所需要的數(shù)據(jù)查詢、分析、執(zhí)行能力,針對這個問題,首先我們要發(fā)現(xiàn)問題的所在,就是說我們要準確的定位問題,然后針對問題進行優(yōu)化,再考慮其他升級改造的事情。

檢查MySQL運行情況

在這里插入圖片描述

可以看到CPU使用率非常高,內(nèi)存使用較低,可以排除不是內(nèi)存影響的。而且內(nèi)存資源還有很大空間。

因此要解決問題,可以從兩方面入手:

  • 優(yōu)化Mysql參數(shù)配置,發(fā)揮服務器硬件性能,通過合適的參數(shù)配置提升Mysql性能(以空間換時間,見效快,成本高)
  • 找到問題原因,優(yōu)化問題sql、添加合理的索引、引入緩存等

方案一:MySQL配置參數(shù)優(yōu)化

查看服務器資源

查看服務器內(nèi)存:

[java@localhost ~]$ grep MemTotal /proc/meminfo 
MemTotal:       266419264 kB   	// 約256G

查看服務器CPU個數(shù):

[java@localhost ~]$ lscpu
架構:                           aarch64
CPU 運行模式:                   64-bit
字節(jié)序:                         Little Endian
CPU:                             64
在線 CPU 列表:                  0-63
每個核的線程數(shù):                 1
每個座的核數(shù):                   32
座:                             2
NUMA 節(jié)點:                      2
廠商 ID:                        HiSilicon
型號:                           0
型號名稱:                       Kunpeng-920
步進:                           0x1
Frequency boost:                 disabled
CPU 最大 MHz:                   2600.0000
CPU 最小 MHz:                   200.0000
BogoMIPS:                       200.00
L1d 緩存:                       4 MiB
L1i 緩存:                       4 MiB
L2 緩存:                        32 MiB
L3 緩存:                        64 MiB
NUMA 節(jié)點0 CPU:                 0-31
NUMA 節(jié)點1 CPU:                 32-63
Vulnerability Itlb multihit:     Not affected
Vulnerability L1tf:              Not affected
Vulnerability Mds:               Not affected
Vulnerability Meltdown:          Not affected
Vulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl
Vulnerability Spectre v1:        Mitigation; __user pointer sanitization
Vulnerability Spectre v2:        Not affected
Vulnerability Srbds:             Not affected
Vulnerability Tsx async abort:   Not affected
標記:                           fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp cpuid asimdrdm jscvt fcma dcpop asimddp asimdfhm ssbs

可以看到服務器有兩個物理CPU,每個物理CPU有32個內(nèi)核數(shù),即總共64個邏輯CPU數(shù)。
一般情況下,邏輯cpu=物理CPU個數(shù)×每顆核數(shù)

觀察MySQL狀態(tài)

MySQL的運行狀態(tài)是我們排查性能問題的第一步。通過查看全局狀態(tài)變量,我們可以獲取系統(tǒng)的整體運行情況。以下是一些關鍵的狀態(tài)變量和信息:

Threads_running 和 Threads_connected

SHOW GLOBAL STATUS LIKE 'Threads_running';
SHOW GLOBAL STATUS LIKE 'Threads_connected';

Threads_running 表示當前正在執(zhí)行的線程數(shù)量。
Threads_connected 表示當前已連接到MySQL的線程數(shù)量。
如果 Threads_running 較高,而 Threads_connected 較低,可能表明存在某些長時間運行的查詢,或者可能是由于連接池配置不當導致連接被頻繁創(chuàng)建和銷毀。

InnoDB 相關狀態(tài)

SHOW ENGINE INNODB STATUS;

查看InnoDB引擎狀態(tài),關注以下信息:

Innodb_row_lock_current_waits:表示當前正在等待的行鎖數(shù)量。
Innodb_deadlocks:顯示發(fā)生的死鎖次數(shù)。
高的行鎖等待和死鎖次數(shù)可能表明業(yè)務邏輯或查詢需要優(yōu)化,或者存在并發(fā)訪問沖突。

Key_reads 和 Key_writes

SHOW GLOBAL STATUS LIKE 'Key_reads';
SHOW GLOBAL STATUS LIKE 'Key_writes';

Key_reads:表示從磁盤讀取索引塊的次數(shù)。
Key_writes:表示向磁盤寫入索引塊的次數(shù)。
高的 Key_reads 可能暗示著索引未能完全放入內(nèi)存中,需要調(diào)整 key_buffer_size 參數(shù)。而頻繁的 Key_writes 可能表明索引的寫入操作較為頻繁,需要考慮索引的優(yōu)化。

Created_tmp_disk_tables

SHOW GLOBAL STATUS LIKE 'Created_tmp_disk_tables';

表示在磁盤上創(chuàng)建的臨時表的數(shù)量。過多的磁盤臨時表可能表明某些查詢需要優(yōu)化,或者 tmp_table_size 參數(shù)設置過小。

Uptime

SHOW STATUS LIKE 'Uptime';

表示MySQL服務的運行時間。如果CPU問題突然發(fā)生,檢查這個值,看是否與問題的時間點相關。

其他關鍵狀態(tài)變量

瀏覽MySQL官方文檔以獲取更多有關全局狀態(tài)變量的信息,根據(jù)具體情況添加監(jiān)控和分析。

通過這些狀態(tài)變量,我們可以初步了解MySQL的整體運行情況,從而有針對性地繼續(xù)深入排查問題。在分析狀態(tài)時,可以使用各種監(jiān)控工具,如pt-mysql-summary或MySQL Enterprise Monitor,以更方便地查看和理解MySQL的狀態(tài)信息。

Mysql參數(shù)設置

數(shù)據(jù)庫屬于IO密集型的應用程序,其主職責就是數(shù)據(jù)的管理及存儲工作。而我們知道,從內(nèi)存中讀取一個數(shù)據(jù)庫的時間是微秒級別,而從一塊普通硬盤上讀取一個 IO是在毫秒級別,二者相差3個數(shù)量級。所以,要優(yōu)化數(shù)據(jù)庫,首先第一步需要優(yōu)化的就是IO,盡可能將磁盤IO轉(zhuǎn)化為內(nèi)存IO。

SELECT version(); // 版本:8.0.30

 // 索引塊的緩沖區(qū)大小,增加它可得到更好處理的索引
show global variables like 'key_buffer_size';  // 默認值:8M

set global key_buffer_size=1024*1024*64

show global variables like 'max_allowed_packet'; // 默認值:64M

show global variables like 'table_open_cache'; // 默認值:4000

set global table_open_cache=16000

// sort_buffer_size是MySql執(zhí)行排序使用的緩沖大小
show global variables like 'sort_buffer_size'; // 默認值:256KB

set global sort_buffer_size=1024*1024*16

show global variables like 'net_buffer_length'; // 默認值:16KB

 //read_buffer_size 是MySql讀入緩沖區(qū)大小。
show global variables like 'read_buffer_size'; // 默認值:128KB

set global read_buffer_size=1024*1024*8

 // tmp_table_size是MySql的heap (堆積)表緩沖大小
show global variables like 'tmp_table_size'; // 默認值:16M

set global tmp_table_size=1024*1024*128

 // read_rnd_buffer_size 是MySql的隨機讀緩沖區(qū)大小
show global variables like 'read_rnd_buffer_size'; // 默認值:256KB

set global read_rnd_buffer_size=1024*1024*4

// thread_cache_size可以重新利用保存在緩存中線程的數(shù)量     
show global variables like 'thread_cache_size'; // 默認值:8

set global thread_cache_size=64



// MySql的最大連接數(shù),如果服務器的并發(fā)連接請求量比較大,建議調(diào)高此值,以增加并行連接數(shù)量,
// 當然這建立在機器能支撐的情況下,因為如果連接數(shù)越多,介于MySql會為每個連接提供連接緩沖區(qū),就會開銷越多的內(nèi)存
show global variables like 'max_connections'; // 最多連接數(shù), 默認:151

set global max_connections=5000;

show global variables like 'max_connect_errors'; // 默認值:100

set global max_connect_errors=1000;

show global variables like 'open_files_limit'; // 默認值:1M

show global variables like 'innodb_data_file_path';    

// InnoDB
// 對InnoDB表性能影響最大的一個參數(shù)。InnoDB緩沖池用于緩存數(shù)據(jù)和索引,對于讀取頻繁的表,適當調(diào)整緩沖池大小可以顯著提升性能。
將
// innodb_buffer_pool_size設置為系統(tǒng)中Mysql可用內(nèi)存的70%左右。這確保了大部分數(shù)據(jù)和索引都可以在內(nèi)存中緩存,減少磁盤I/O操作。
show global variables like 'innodb_buffer_pool_size'; // 默認值:128M

set global innodb_buffer_pool_size=1024*1024*1024*32 //32G

//InnoDB事務日志文件大小
 show global variables like 'innodb_log_file_size';

// InnoDB存儲引擎的事務日志所使用的緩沖區(qū)
show global variables like 'innodb_log_buffer_size';  // 默認值:16M

set global innodb_log_buffer_size=1024*1024*128

show global variables like 'sync_binlog';

set global sync_binlog=1000

可根據(jù)自己服務器性能動態(tài)調(diào)整,但重啟后會失效,最好同時修改my.cnf配置文件:

通過參數(shù)調(diào)優(yōu)后的MySQL狀態(tài):

在這里插入圖片描述

方案二:SQL問題分析定位解決

MySQL的查詢分析是排查性能問題的關鍵步驟。通過檢查慢查詢?nèi)罩竞褪褂眯阅芊治龉ぞ?,我們可以找到潛在的性能瓶頸。

  • 啟用慢查詢?nèi)罩?br />首先,確保MySQL的慢查詢?nèi)罩竟δ芤褑⒂?。在MySQL配置文件中添加以下配置:
slow_query_log = 1
slow_query_log_file = /usr/local/mysql/slowlog/slow-query.log
long_query_time = 1

slow_query_log 啟用慢查詢?nèi)罩尽?br />slow_query_log_file 設置慢查詢?nèi)罩疚募窂健?br />long_query_time 定義慢查詢的時間閾值(單位:秒),這里設置為1秒。

或者使用MySQL客戶端:

 
-- 啟動慢查詢?nèi)罩?
set global slow_query_log='ON';

-- 設置慢查詢存儲文件地址
set global slow_query_log_file='/usr/local/mysql/slowlog/slow-query.log';
 
-- 設置儲存sql條件,sql 執(zhí)行時間高于0.001秒存入日志文件
set global long_query_time=0.001;

-- 開啟 記錄沒有使用索引查詢語句
set global log-queries-not-using-indexes = on
  • 分析慢查詢?nèi)罩?br />使用以下命令查看慢查詢?nèi)罩局械膬?nèi)容:
tail -f /usr/local/mysql/slowlog/slow-query.log

或者使用MySQL客戶端:

SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'slow_query_log_file';

通過檢查慢查詢?nèi)罩?,識別執(zhí)行時間長的查詢。注意關注查詢的執(zhí)行計劃,以便理解MySQL是如何處理這些查詢的。

  • 使用慢查詢分析工具
    使用工具如pt-query-digest來分析慢查詢?nèi)罩荆?/li>
pt-query-digest /path/to/slow-query.log

該工具能夠生成詳細的報告,包括執(zhí)行時間最長的查詢、查詢頻率、索引使用情況等信息。通過這些信息,您可以確定哪些查詢需要優(yōu)化,以提高其性能。

  • Explain命令
    對于特定的查詢,使用EXPLAIN命令來查看其執(zhí)行計劃:
EXPLAIN SELECT * FROM your_table WHERE your_condition;

EXPLAIN命令將顯示MySQL執(zhí)行查詢時的執(zhí)行計劃,包括使用的索引、訪問表的方式等。通過分析執(zhí)行計劃,您可以了解查詢的性能瓶頸,并進行相應的優(yōu)化。

  • 優(yōu)化查詢
    根據(jù)慢查詢?nèi)罩竞蛨?zhí)行計劃的分析結果,對性能較差的查詢進行優(yōu)化??赡艿膬?yōu)化方式包括:
  • 優(yōu)化查詢語句,避免全表掃描。
  • 優(yōu)化 SQL,降低 SQL 復雜度,降低 MySQL 執(zhí)行成本。
  • 確保查詢涉及的列都有合適的索引。
  • 考慮分表、分區(qū)表等策略,以減少單表的數(shù)據(jù)量。

通過以上步驟,您將能夠更好地理解哪些查詢對系統(tǒng)性能有負面影響,并有針對性地進行優(yōu)化,提高整體性能。

結論

通過以上步驟,您應該能夠定位和解決MySQL CPU使用率過高的問題。請注意,每個生產(chǎn)環(huán)境都是獨特的,可能需要根據(jù)實際情況進行適當調(diào)整。保持監(jiān)控和定期優(yōu)化是確保MySQL性能穩(wěn)定的關鍵。希望這篇文章對您解決MySQL性能問題提供了幫助。如果有任何問題或建議,請隨時留言。

到此這篇關于MySQL生產(chǎn)環(huán)境CPU使用率過高的排查與解決方案的文章就介紹到這了,更多相關MySQL CPU使用率過高內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Windows平臺下MySQL安裝與配置方法與注意事項

    Windows平臺下MySQL安裝與配置方法與注意事項

    這篇文章主要介紹了Windows平臺下MySQL安裝與配置方法與注意事項,需要的朋友可以參考下
    2017-04-04
  • Mysql子查詢IN中使用LIMIT應用示例

    Mysql子查詢IN中使用LIMIT應用示例

    有3張表,infor信息表,mconfig物料配置表,maaply物料申請表,要求是讀出申請表中哪些人申請哪些物料,接下來為大家介紹下Mysql子查詢IN中使用LIMIT
    2014-01-01
  • mysql如何配置白名單訪問

    mysql如何配置白名單訪問

    這篇文章主要介紹了mysql配置白名單訪問的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Mysql字段為NULL時是否會導致索引失效

    Mysql字段為NULL時是否會導致索引失效

    這篇文章主要介紹了Mysql字段為NULL時是否會導致索引失效的問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • MySQL安全模式下創(chuàng)建賬號的操作指南

    MySQL安全模式下創(chuàng)建賬號的操作指南

    MySQL 的安全模式通常指在跳過權限驗證或限制特定功能的狀態(tài)下啟動數(shù)據(jù)庫,常用于管理員密碼遺忘、權限損壞等緊急維護場景,本文給大家介紹了如何在MySQL安全模式下創(chuàng)建賬號,需要的朋友可以參考下
    2026-05-05
  • 簡單了解 MySQL 中相關的鎖

    簡單了解 MySQL 中相關的鎖

    這篇文章主要介紹了簡單了解 MySQL 中相關的鎖,重點介紹InnoDB中的鎖相關知識,包括鎖的概念及分類解析,對MySQL鎖相關感興趣的朋友跟隨小編一起看看吧
    2021-05-05
  • MySQL定位長事務(Identify Long Transactions)的實現(xiàn)

    MySQL定位長事務(Identify Long Transactions)的實現(xiàn)

    在MySQL的運行中,經(jīng)常會遇到一些長事務,本文主要介紹了MySQL定位長事務,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-09-09
  • mysql 觸發(fā)器用法實例詳解

    mysql 觸發(fā)器用法實例詳解

    這篇文章主要介紹了mysql 觸發(fā)器用法實例詳解的相關資料,需要的朋友可以參考下
    2017-06-06
  • 聊一聊MyISAM和InnoDB的區(qū)別

    聊一聊MyISAM和InnoDB的區(qū)別

    這篇文章主要介紹了聊一聊MyISAM和InnoDB的區(qū)別,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • 理解MySQL變量和條件

    理解MySQL變量和條件

    這篇文章主要幫助大家深入理解MySQL變量和條件,感興趣的小伙伴們可以參考一下
    2016-03-03

最新評論

祁东县| 朔州市| 阿坝| 茂名市| 英吉沙县| 资溪县| 松溪县| 涡阳县| 游戏| 太谷县| 海兴县| 通化县| 赤壁市| 安乡县| 丰城市| 静海县| 凉山| 南岸区| 枣庄市| 哈尔滨市| 故城县| 健康| 那曲县| 吉水县| 拜城县| 竹溪县| 台南市| 甘洛县| 东乌珠穆沁旗| 寿光市| 曲水县| 东港市| 永兴县| 临安市| 镇宁| 阳新县| 湟源县| 古田县| 黄浦区| 确山县| 息烽县|