MySQL không giải phóng bộ nhớ


8

MySQL dường như muốn giữ toàn bộ bảng trong bộ đệm (kích thước bảng = ~ 20GB) sau khi bất kỳ thao tác chèn hoặc chọn câu lệnh lớn nào được thực hiện trên đó. Ngay bây giờ nhóm bộ đệm innodb của tôi là 20GB. Tổng RAM là 32GB. Tôi sẽ cung cấp một số sử dụng bộ nhớ và đầu ra từ trạng thái innodb cũng như đầu ra từ mysqltuner. Nó đã khiến tôi phát điên trong vài ngày qua. Xin vui lòng giúp đỡ! Tôi đánh giá cao bất kỳ thông tin phản hồi và xin vui lòng cho tôi biết nếu bạn cần thêm thông tin.

Ngoài ra, thực hiện một 'BẢNG XÓA' chỉ cần đóng và mở lại chúng trong bộ nhớ. Ít nhất tôi nghĩ đó là những gì đang xảy ra. Đây là trạng thái bộ nhớ hiện tại innodb trước khi tôi thực hiện một loạt các chèn:

----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 21978152960; in additional pool allocated 0
Dictionary memory allocated 6006471
Buffer pool size   1310719
Free buffers       347984
Database pages     936740
Old database pages 345808
Modified db pages  0
Pending reads 0
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 78031, not young 0
0.00 youngs/s, 0.00 non-youngs/s
Pages read 551887, created 384853, written 4733512
0.00 reads/s, 0.00 creates/s, 0.00 writes/s
No buffer pool page gets since the last printout
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 936740, unzip_LRU len: 0
I/O sum[0]:cur[0], unzip sum[0]:cur[0]

Sử dụng bộ nhớ phần trăm mysqld: 60,9%

Sử dụng bộ nhớ phần trăm mysqld sau khi chèn (1 triệu bản ghi): 63,3%

và sau đó chèn thêm (3 triệu bản ghi): 70,2%

nó không nên giới hạn ở mức khoảng 62,5% ? (20 / 32GB) tổng ram?

đầu ra từ việc sắp xếp hàng đầu sử dụng MEM của tôi:

top - 14:30:56 up 23:25,  3 users,  load average: 3.63, 2.31, 1.91
Tasks: 208 total,   4 running, 204 sleeping,   0 stopped,   0 zombie
Cpu(s): 96.0%us,  3.0%sy,  0.0%ni,  0.0%id,  1.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  28821396k total, 28609868k used,   211528k free,   138696k buffers
Swap: 33554428k total,    30256k used, 33524172k free,  1208184k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 1228 mysql     20   0 25.1g  19g 5512 S   31 70.2  62:01.10 mysqld

đây là đầu ra bộ nhớ innodb sau khi các phần chèn này được thực hiện:

----------------------
BUFFER POOL AND MEMORY
----------------------
Total memory allocated 21978152960; in additional pool allocated 0
Dictionary memory allocated 6006471
Buffer pool size   1310719
Free buffers       271419
Database pages     1011886
Old database pages 373510
Modified db pages  4262
Pending reads 1
Pending writes: LRU 0, flush list 0, single page 0
Pages made young 82521, not young 0
7.08 youngs/s, 0.00 non-youngs/s
Pages read 585218, created 426667, written 5192189
24.08 reads/s, 53.08 creates/s, 1135.07 writes/s
Buffer pool hit rate 1000 / 1000, young-making rate 0 / 1000 not 0 / 1000
Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.00/s
LRU len: 1011886, unzip_LRU len: 0
I/O sum[0]:cur[266], unzip sum[0]:cur[0]

Theo trạng thái innodb, tổng bộ nhớ được phân bổ là như nhau-- tuy nhiên HĐH của tôi (Virtual Ubuntu Server 12.04) đang báo cáo việc sử dụng bộ nhớ nhiều hơn thế. Việc sử dụng bộ nhớ vẫn giữ nguyên và ở đây tôi định nghĩa nó là dịch vụ MySQL không "giải phóng" bộ nhớ. Bất kỳ đề xuất?

đầu ra từ mysqltuner.pl:

-------- Storage Engine Statistics -------------------------------------------
[--] Status: +ARCHIVE +BLACKHOLE +CSV -FEDERATED +InnoDB +MRG_MYISAM
[--] Data in MyISAM tables: 226M (Tables: 287)
[--] Data in InnoDB tables: 33G (Tables: 1000)
[--] Data in PERFORMANCE_SCHEMA tables: 0B (Tables: 17)
[--] Data in MEMORY tables: 0B (Tables: 1)
[!!] Total fragmented tables: 959

-------- Security Recommendations  -------------------------------------------
[OK] All database users have passwords assigned

-------- Performance Metrics -------------------------------------------------
[--] Up for: 23h 14m 27s (1M q [14.603 qps], 6K conn, TX: 16B, RX: 1B)
[--] Reads / Writes: 46% / 54%
[--] Total buffers: 22.2G global + 2.7M per thread (151 max threads)
[OK] Maximum possible memory usage: 22.6G (82% of installed RAM)
[OK] Slow queries: 0% (6/1M)
[OK] Highest usage of available connections: 6% (10/151)
[OK] Key buffer size / total MyISAM indexes: 2.0G/58.7M
[OK] Key buffer hit rate: 100.0% (216M cached / 38K reads)
[OK] Query cache efficiency: 81.2% (799K cached / 984K selects)
[!!] Query cache prunes per day: 5561
[OK] Sorts requiring temporary tables: 4% (819 temp sorts / 16K sorts)
[!!] Temporary tables created on disk: 27% (6K on disk / 22K total)
[OK] Thread cache hit rate: 99% (11 created / 6K connections)
[!!] Table cache hit rate: 0% (97 open / 10K opened)
[OK] Open file limit used: 12% (129/1K)
[OK] Table locks acquired immediately: 99% (433K immediate / 433K locks)
[!!] InnoDB  buffer pool / data size: 20.0G/33.6G
[OK] InnoDB log waits: 0
-------- Recommendations -----------------------------------------------------
General recommendations:
    Run OPTIMIZE TABLE to defragment tables for better performance
    MySQL started within last 24 hours - recommendations may be inaccurate
    Enable the slow query log to troubleshoot bad queries
    When making adjustments, make tmp_table_size/max_heap_table_size equal
    Reduce your SELECT DISTINCT queries without LIMIT clauses
    Increase table_cache gradually to avoid file descriptor limits
    Read this before increasing table_cache over 64: http://bit.ly/1mi7c4C
Variables to adjust:
    query_cache_size (> 128M)
    tmp_table_size (> 128M)
    max_heap_table_size (> 16M)
    table_cache (> 431)
    innodb_buffer_pool_size (>= 33G)

Câu trả lời:


8

Trước hết, hãy xem Kiến trúc InnoDB (lịch sự của Percona CTP Vadim Tkachenko)

Kiến trúc InnoDB

InnoDB

Trạng thái của bạn cho Buffer Pool nói

Kích thước bể đệm 1310719

Đó là Kích thước bộ đệm của bạn trong trang. Mỗi trang là 16K . Điều đó hóa ra 20G - 16K.

Vui lòng lưu ý những điều sau: Bạn đã đẩy dữ liệu vào Nhóm đệm InnoDB. Những gì đã thay đổi ?

Buffer pool size   1310719 
Free buffers       271419 (It was 347984)
Database pages     1011886 (Is was 936740)
Old database pages 373510 (It was 345808)
Modified db pages  4262 (It was 0)

Ngoài ra, lưu ý sự khác biệt giữa Kích thước nhóm bộ đệm trong trang.

1310719 (Kích thước nhóm bộ đệm) - 1011886 (Trang cơ sở dữ liệu) = 298833

Đó là 298833 trang InnoDB. Đó là bao nhiêu không gian ???

mysql> select FORMAT(((1310719  - 1011886) * 16384) / power(1024,3),3) SpaceUsed;
+-----------+
| SpaceUsed |
+-----------+
| 4.560     |
+-----------+

Đó là 4,56GB. Không gian đó được sử dụng cho Phần Bộ đệm Chèn của Nhóm Bộ đệm InnoDB (còn gọi là Bộ đệm Thay đổi) . Điều này được sử dụng để giảm thiểu các thay đổi đối với các chỉ mục nonunique vào Tệp không gian bảng hệ thống (tất cả đều được biết là ibdata1).

Công cụ lưu trữ InnoDB đang quản lý các bộ phận bên trong của Buffer Pool. Do đó, InnoDB sẽ không bao giờ vượt qua 62,5% RAM. Hơn thế nữa, RAM cho Buffer Pool không bao giờ được trả lại.

70,2% RAM ĐÃ ĐẾN Ở ĐÂU ???

Nhìn lại đầu ra của mysqltuner.plnhững dòng này

[OK] Maximum possible memory usage: 22.6G (82% of installed RAM)
Key buffer size / total MyISAM indexes: 2.0G/58.7M
[--] Total buffers: 22.2G global + 2.7M per thread (151 max threads)

mysqld có ba cách phân bổ RAM chính

Bất kỳ sự tăng đột biến nhỏ nào trong Kết nối DB sẽ tăng RAM vượt qua ngưỡng 62,5% mà bạn thấy đối với InnoDB.

MyISAM (Lưu ý bên)

Điều làm tôi chú ý là

Key buffer size / total MyISAM indexes: 2.0G/58.7M

Vì bạn có rất ít chỉ mục cho MyISAM. Bạn có thể đặt key_buffer_size thành 64M.

Bạn không cần phải khởi động lại mysql cho điều đó. Chỉ cần chạy

SET GLOBAL ket_buffer_size = 1024 * 1024 * 64;

Sau đó, sửa đổi điều này trong my.cnf

[mysqld]
key_Buffer_size = 64M

Điều này sẽ cung cấp cho HĐH 2GB RAM. VM của bạn sẽ đơn giản yêu bạn vì điều đó !!!

Hãy thử một lần !!!

CAUPAT

Chạy FLUSH TABLEStrên các bảng InnoDB chỉ cần đóng các tệp đối với các .ibdtệp. Điều này sẽ không thực sự thúc đẩy thay đổi trực tiếp. Các thay đổi phải di chuyển theo cách của InnoDB. Đây là lý do tại sao bạn nhìn thấy sự tăng đột biến trong Modified db pages. 4262 trang đã thay đổi (66,59 MB) bị xóa khi lịch trình của InnoDB bị xóa.


cảm ơn bạn rất nhiều vì đã phân tích chuyên sâu Điều này có ý nghĩa hơn nhiều bây giờ-- vậy có đúng là nhóm bộ đệm innodb sẽ duy trì mức sử dụng bộ nhớ tối đa theo thời gian (20GB) không? Và tổng bộ nhớ mysqld sẽ sử dụng là 82% ??
chuler

Đó là Có cho cả hai câu hỏi
RolandoMySQLDBA

0

Tôi đã phải đối mặt với loại vấn đề tương tự. Câu hỏi: bạn đang sử dụng cấu hình bộ nhớ chia? (THP và được chia sẻ) Nếu có thì vô hiệu hóa các ôm và để MySQL xử lý bộ nhớ và tiếp tục theo dõi nó. Đồng thời kiểm tra có bao nhiêu tiến trình song song đang chạy trên máy chủ bao gồm các tiến trình ở chế độ Ngủ. Nếu bạn đang sử dụng cấu hình bộ nhớ dùng chung thì bạn cần thêm bộ nhớ cho máy chủ này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.