MySQL 5.7.21 將分區寫入磁碟後未釋放記憶體
我一直在測試使用 SELECT * 從 MySQL 5.7.21 和 5.7.22 的分區表中的分區中提取我沒有想法並且撞到牆上。目標是將數據寫入 S3 以供其他應用使用。
感謝您提供任何回饋,如果您需要更多資訊,請告訴我。
TL;DR 如果發生足夠的提取(選擇 * 到 OS 文件),伺服器上的記憶體永遠不會恢復並最終掛起。
筆記:
- 每個表使用 innodb 文件,並且在 /etc/limits.conf 中對 mysql 沒有限制(/proc/pid/limits 下面列出)
- 這是一個專門為這個提取測試而啟動的伺服器。
- 伺服器是針對記憶體優化的雲 EC2 r4.2xlarge 61GB 4VCPU。
- 最初 my.cnf 設置與我們沒有這種載入模式的生產環境相同(因為它是新的)
在我的搜尋中,我發現了一些關於如何調整失速方面的相互矛盾的建議。我不認為這是拖延行為,因為記憶體永遠不會被回收。
使用 grep Mem /proc/meminfo, top in batch mode, iostat, netstat -i 從整體上查看系統我排除了磁碟、網路流量飽和、寫入磁碟的文件大小。
我把它縮小到只是記憶問題。
我可以始終如一
- 停止mysql,重新啟動它並完全分配記憶體。
- 從大或小分區或多個系列中提取數據到 OS 文件(這些測試沒有二進制日誌記錄,輸出沒有壓縮)
- 在將足夠的分區寫入磁碟後,我會在系統掛起“無法分叉”之前將資訊發送到作業系統的標準輸出
- 重新啟動伺服器可以釋放記憶體,並且可以從停止的地方再次重播提取過程。
- CPU 可以通過更大的提取(超過 10G)達到 100%,並且系統不會在 CPU 上停止。
- 提取後刷新表沒有影響。並且參數調整沒有影響(沒有正確的組合/不知道什麼組合起作用)
- 正常執行時間顯示負載在 5、10、15 分鐘間隔內永遠不會超過 2
- status 命令報告打開表永遠不會超過 500 並且打開文件限制為 5K
來自工作台的性能模式報告指出它在執行時的前 5% 中。並且它正在該分區上執行 FTS。
Query, Full Table Scan, Executed (#), Errors (#), Warnings (#), Total Time, Maximum Time, Avg Time, Rows Sent (#), Avg. Rows Sent (#), Rows Scanned (#), Avg. Rows Scanned (#), Digest SELECT * FROM `schema` . `partitioned_table` PARTITION ( `date_partition` ) , *, 1, 0, 0, 267744528.92, 267744528.92, 267744528.92, 7446849, 7446849.0, 7446849, 7446849.0, fcb788d6ea76c986d767b282efa1ca11
我查看了MySQL 沒有釋放記憶體,並且一些 MySQL 報告了錯誤。
/proc/(pid_of_mysqld)/limits 上的限制
cat /proc/30613/limits Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds Max file size unlimited unlimited bytes Max data size unlimited unlimited bytes Max stack size 8388608 unlimited bytes Max core file size 0 unlimited bytes Max resident set unlimited unlimited bytes Max processes 245523 245523 processes Max open files 5000 5000 files Max locked memory 65536 65536 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 245523 245523 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us
mysql_safe 程序的限制
cat /proc/30023/limits Limit Soft Limit Hard Limit Units Max cpu time unlimited unlimited seconds Max file size unlimited unlimited bytes Max data size unlimited unlimited bytes Max stack size 8388608 unlimited bytes Max core file size 0 unlimited bytes Max resident set unlimited unlimited bytes Max processes 245523 245523 processes Max open files 1024 4096 files Max locked memory 65536 65536 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 245523 245523 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us
查看 /proc/meminfo 在允許掛起清理之前在最低點進行比較(下面顯示了值處於最低點時的差異 - 不是 /proc/meminfo 的整個列表)
grep -Fxvf lowest_meminfo clean_meminfo MemFree: 27793236 kB MemAvailable: 54872272 kB Buffers: 71980 kB Cached: 27404904 kB Active: 11688912 kB Inactive: 22872372 kB Active(anon): 7084432 kB Active(file): 4604480 kB Inactive(file): 22872320 kB Dirty: 24 kB AnonPages: 7084488 kB Mapped: 41360 kB Slab: 335776 kB SReclaimable: 309948 kB SUnreclaim: 25828 kB KernelStack: 3792 kB PageTables: 21028 kB Committed_AS: 55038256 kB
此系統和其他 prod 系統上的錯誤日誌在提取、mysqldump 或載入 outfile/infile 時已註意到這一點;這導致了我關於拖延的文章。
[Note] InnoDB: page_cleaner: 1000ms intended loop took 11681ms. The settings might not be optimal.
在這種情況下發生的事情是 /etc/my.cnf 文件在
$$ client $$ 部分。 使用 meminfo、iostat、netstat、top.、uptime 和 while 循環來查看正在寫入磁碟的文件的時間戳——我注意到文件只會在提取過程的最後寫入磁碟。
文件系統 ext4 也不在其中,因為 iostat 沒有顯示出它很難固定。
儘管記憶體仍然因此而下降。讀入記憶體以寫入磁碟的數量被緩衝(分塊),結果是系統可以處理多個千兆字節大小的輸出文件。
PARTITIONs
這是一張桌子上沒有很多東西的眾多原因之一。這張桌子有幾張?50 是一個“合理”的限制。無論如何,請提供SHOW CREATE TABLE
。威爾遜要求的
SHOWs
也將有助於找出問題。我懷疑這將是 3 個表記憶體設置之一。(獲得更多資訊後,此答案“待續”。)