搜尋
首頁資料庫mysql教程 MySQL 内存交换区引起的一

MySQLPerformancemurder--SWAP故事情节:最近公司上了一个新的项目,关于搜..

                 MySQL Performance murder -- SWAP

故事情节:

最近公司上了一个新的项目,关于搜索一块的项目。其程序会调用大量的SQL,包括各种条件的搜索,模糊的匹配,联动的效果,etc。其目的,是提高百度or谷歌的爬虫的量;其效果,确实有了,从上线了,据SEO相关部门的统计爬虫抓取的量大概翻了5倍。各个都Happy,唯独我Happy不起来,因为MySQL的负载极其不稳定。当晚上线时,就发现Slave的负载有点猛,CTO一声令下,再加一台Slave,点头做事就OK了,呵呵。另加了一台Slave,发现Slave的负载,确实都回归正常了,本以为息事宁人呢,,,谁知,大概隔了3,4个小时吧,新添加的Slave的负载暴增,大概160+,么情况?原来的slave到是显得平静无事。大概过了1个小时,新增加的Slave的负载回归正常,大概也就是零点几的样子;隔几个小时,负载又是直接飙升100+。没得说,身为DBA,就是要Troubleshooting。

Troubleshooting的过程:

1:因为是间接性抽风,所以认为肯定和前台的访问的频率,及调用的scope相关;就结合前台的日志,发现确实是这样。都是百度的or谷歌的爬虫疯狂的访问新的项目(搜索)时,新增的Slave的负载就会疯一样的增长。可是为何原来的Slave为何没有太大的波动呢?

2:考虑到新增的server,因为内存,CPU等硬件的配置和原来数据库的server都不一样(其实是新增的Slave比原来的Slave的内存少了一半),必然配置参数的值也会不同。所以就从MySQl的配置文件查起,如:sort_buffer_size的大小(因为考虑到有许多SQL包含排序),join_buffer_size(用于连接的缓存的大小),max_connections(最大连接数,可是通过show processlist;发现也没有超过设置的值),innodb_buffer_pool_size(确认是否为物理内存的合适比例)等等。实际自己也犯2了,呵呵,身为DBA,这都是基本的配置,按照正常的逻辑判断也不该有多大的问题,只要把这些参数设置在合理的范围内,香港虚拟主机,不会引起负载那么大的波动。那为何呢?考虑到是新装的系统,莫非是系统的参数引起的?

3:于是开始查找关于一些TCP/IP,打开文件最大数等等,按照网友的最优调整,只能说希望越大失望越大吧,不起任何作用。这尼玛到底怎么回事呢?要是两台Slave出现相同的情况,也好解决了,可是就这台新增加的Slave有问题,,,没得选,静下心来,恍然大悟,才考虑到系统的CPU,内存,IO的波动。

4:通过排查,CPU正常,但是问题出来了,发现free -m查看内存时,发现SWAP既然使用了300MB,怎么会使用这么多,香港空间,所以一口咬定就死SWAP捣的蛋。通过vmsata,发现si和so的值不断的变化,所以更加的肯定是发生了内存交换。既然找到问题了,那就解决吧。

内存交换区:

当操作系统因为没有足够的内存而将一些虚拟内存写到磁盘就会发生内存交换。

内存交换对MySQL性能影响是极其糟糕的。它破坏了缓存在内存的目的,并且相对于使用很小的内存做缓存,使用交换区的性能更差。MySQL和存储引擎有很多算法来区别对待内存中的数据和硬盘上的数据,因为一般都是假设内存数据访问代价更低。

因为内存交换对用户进程不可见,MySQL(或存储引擎)并不知道数据实际上已经移动到磁盘,还会意味在内才能中。

结果会导致很差的性能。例如。若存储引擎认为数据依然在内存,可能觉得为"短暂"的内存操作锁定一个全局互斥变量(例如,InnoDB缓冲池Mutex)是OK的。如果这个操作实际上引起了硬盘I/O,直到I/O操作完成前任何操作都会被挂起。这意味着内存交换比直接做硬盘I/O操作还要糟糕。

在GNU/Linux上,可以用vmstat来监控内存交换。最好查看si和so列报告的内存交换I/O活动,这比看swapd列报告的交换区利用率更重要。我们都喜欢si和so列的值为0,并且一定要保证它们低于每秒10块。

可以通过正确地配置MySQL缓冲来解决大部分内存交换问题,但是有时操作系统的虚拟内存系统还是会决定交换MySQL内存。这通常发生在操作系统看到MySQL发出了大量I/O,因此尝试增加文件缓存来保存更多数据时。如果没有足够的内存,有些东西就必须交换出去,有些可能就是MySQL本身。

有些人主张完全禁用交换文件。这样做是很危险的,因为禁用内存交换就相当于给虚拟内存设置了一个不可动摇的限制。如果MySQL需要临时使用很大一块内存,或者有很耗内存的进程运行在同一台server上(如夜间的批量任务),MySQL可能会内存溢出,崩溃,或者被操作系统kill掉。

操作系统通常允许对虚拟内存和I/O进行一些控制。最基本的方法就是修改/proc/sys/vm/swappiness为一个很小的值,如0或1。这等同于告诉内核除非虚拟内存完全满了,否则不要使用交换区。下面是如何检查这个值的例子:

$ cat /proc/sys/vm/swappiness 60

这个值显示为60,这是默认的设置(范围是0~100)。对于服务器而言这是个很糟糕的默认值。服务器应该设置为0:

$ echo 0 > /proc/sys/vm/swappiness

另一个选项是修改存储引擎怎么读取和写入数据。使用innodb_flush_method=O_DIRECT,减轻I/O压力。DIRECT I/O并不缓存,因此操作系统并不能把MySQL视为增加文件缓存的原因。这个参数只对InnoDB有效。你也可以使用大页,不参与换入换出,这对MyISAM和InnoDB都有效。

另一个选择是使用MySQL的memlock配置项,可以把MySQL锁定在内存。这可以避免交换,但是也可能带来危险:如果没有足够的可锁定内存,MySQL在尝试分配更多内存时就会崩溃。

解决问题:

第一种方法:修改系统对虚拟内存的控制

$ echo 0 > /proc/sys/vm/swappiness #要想永久生效,将其配置写入/etc/sysctl.conf文件中 $ echo "vm.swappiness=0" >> /etc/sysctl.conf #令其立即生效 $ sysctl -p
陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
解釋酸的特性(原子,一致性,隔離,耐用性)。解釋酸的特性(原子,一致性,隔離,耐用性)。Apr 16, 2025 am 12:20 AM

ACID屬性包括原子性、一致性、隔離性和持久性,是數據庫設計的基石。 1.原子性確保事務要么完全成功,要么完全失敗。 2.一致性保證數據庫在事務前後保持一致狀態。 3.隔離性確保事務之間互不干擾。 4.持久性確保事務提交後數據永久保存。

MySQL:數據庫管理系統與編程語言MySQL:數據庫管理系統與編程語言Apr 16, 2025 am 12:19 AM

MySQL既是數據庫管理系統(DBMS),也與編程語言緊密相關。 1)作為DBMS,MySQL用於存儲、組織和檢索數據,優化索引可提高查詢性能。 2)通過SQL與編程語言結合,嵌入在如Python中,使用ORM工具如SQLAlchemy可簡化操作。 3)性能優化包括索引、查詢、緩存、分庫分錶和事務管理。

mySQL:使用SQL命令管理數據mySQL:使用SQL命令管理數據Apr 16, 2025 am 12:19 AM

MySQL使用SQL命令管理數據。 1.基本命令包括SELECT、INSERT、UPDATE和DELETE。 2.高級用法涉及JOIN、子查詢和聚合函數。 3.常見錯誤有語法、邏輯和性能問題。 4.優化技巧包括使用索引、避免SELECT*和使用LIMIT。

MySQL的目的:有效存儲和管理數據MySQL的目的:有效存儲和管理數據Apr 16, 2025 am 12:16 AM

MySQL是一種高效的關係型數據庫管理系統,適用於存儲和管理數據。其優勢包括高性能查詢、靈活的事務處理和豐富的數據類型。實際應用中,MySQL常用於電商平台、社交網絡和內容管理系統,但需注意性能優化、數據安全和擴展性。

SQL和MySQL:了解關係SQL和MySQL:了解關係Apr 16, 2025 am 12:14 AM

SQL和MySQL的關係是標準語言與具體實現的關係。 1.SQL是用於管理和操作關係數據庫的標準語言,允許進行數據的增、刪、改、查。 2.MySQL是一個具體的數據庫管理系統,使用SQL作為其操作語言,並提供高效的數據存儲和管理。

說明InnoDB重做日誌和撤消日誌的作用。說明InnoDB重做日誌和撤消日誌的作用。Apr 15, 2025 am 12:16 AM

InnoDB使用redologs和undologs確保數據一致性和可靠性。 1.redologs記錄數據頁修改,確保崩潰恢復和事務持久性。 2.undologs記錄數據原始值,支持事務回滾和MVCC。

在解釋輸出(類型,鍵,行,額外)中要查找的關鍵指標是什麼?在解釋輸出(類型,鍵,行,額外)中要查找的關鍵指標是什麼?Apr 15, 2025 am 12:15 AM

EXPLAIN命令的關鍵指標包括type、key、rows和Extra。 1)type反映查詢的訪問類型,值越高效率越高,如const優於ALL。 2)key顯示使用的索引,NULL表示無索引。 3)rows預估掃描行數,影響查詢性能。 4)Extra提供額外信息,如Usingfilesort提示需要優化。

在解釋中使用臨時狀態以及如何避免它是什麼?在解釋中使用臨時狀態以及如何避免它是什麼?Apr 15, 2025 am 12:14 AM

Usingtemporary在MySQL查詢中表示需要創建臨時表,常見於使用DISTINCT、GROUPBY或非索引列的ORDERBY。可以通過優化索引和重寫查詢避免其出現,提升查詢性能。具體來說,Usingtemporary出現在EXPLAIN輸出中時,意味著MySQL需要創建臨時表來處理查詢。這通常發生在以下情況:1)使用DISTINCT或GROUPBY時進行去重或分組;2)ORDERBY包含非索引列時進行排序;3)使用複雜的子查詢或聯接操作。優化方法包括:1)為ORDERBY和GROUPB

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
4 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

mPDF

mPDF

mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具