Bạn nhận thấy MySQL trên Windows (XAMPP) dùng RAM tăng dần đến 7GB,
chỉ khi restart MySQL thì RAM mới giảm xuống còn khoảng 3.5GB, sau đó lại tăng dần trở lại (khoảng 5–7GB).
Đây là hành vi bình thường của MySQL, không phải lỗi hay rò rỉ bộ nhớ.
Nguyên nhân chính là do InnoDB Buffer Pool — bộ nhớ đệm (cache) của MySQL được cấp phát để tăng tốc độ đọc/ghi dữ liệu.
MySQL không trả RAM về hệ điều hành, ngay cả khi rảnh, vì:
RAM chỉ giảm khi:
Bạn đã chạy:
SHOW STATUS LIKE 'Innodb_buffer_pool%';
và nhận được kết quả (tóm tắt quan trọng):
Tham số | Giá trị | Giải thích |
---|---|---|
Innodb_buffer_pool_pages_total | 393,216 | Tổng số trang (mỗi trang 16KB) → tương đương ~6GB |
Innodb_buffer_pool_pages_data | 82,760 | Số trang thực sự chứa dữ liệu |
Innodb_buffer_pool_bytes_data | ~1.35 GB | Tổng dữ liệu thực đang dùng |
Innodb_buffer_pool_pages_free | 310,140 | Số trang trống (chưa dùng đến) |
Innodb_buffer_pool_pages_dirty | 0 | Không có dữ liệu chờ ghi ra đĩa (ổn định, không lỗi) |
👉 Nghĩa là:
MySQL đã cấp phát 6GB RAM cho buffer pool,
nhưng mới dùng thực tế ~1.3GB dữ liệu.
Phần còn lại (~4.7GB) chỉ là vùng trống mà MySQL “giữ sẵn” để dùng tiếp.
InnoDB cache bao gồm:
Thành phần | Mô tả | Tác dụng |
---|---|---|
innodb_buffer_pool_size | Dung lượng tối đa MySQL được phép giữ trong RAM | Cache dữ liệu + index InnoDB |
query_cache_size | Cache kết quả truy vấn (cũ, thường tắt ở MySQL 5.7+) | Nên tắt để tránh overhead |
tmp_table_size , max_heap_table_size | Bộ nhớ cho bảng tạm khi xử lý truy vấn | Có thể giới hạn để tránh “bùng RAM” |
max_connections | Mỗi connection tiêu tốn RAM riêng (sort buffer, join buffer) | Nên giới hạn nếu nhiều kết nối |
performance_schema | Dữ liệu giám sát nội bộ | Có thể tắt nếu không cần |
Giả sử bạn có 8GB RAM:
innodb_buffer_pool_size
hiện khoảng 6GB,Điều này không nguy hiểm nếu hệ thống vẫn chạy mượt, không swap.
Bạn nên giảm buffer pool xuống còn 3GB để hệ thống ổn định và không chiếm quá nhiều tài nguyên.
Mở file cấu hình:
D:\xampp\mysql\bin\my.ini
Thêm hoặc chỉnh lại phần [mysqld]
:
[mysqld] innodb_buffer_pool_size = 3G innodb_buffer_pool_instances = 3 max_connections = 100 tmp_table_size = 32M max_heap_table_size = 32M query_cache_type = 0 query_cache_size = 0 performance_schema = OFF
Sau đó restart MySQL.
Trước | Sau khi chỉnh |
---|---|
MySQL chiếm ~7GB RAM | Giới hạn tối đa ~3.0–3.5GB RAM |
RAM không giảm trừ khi restart | Ổn định hơn, MySQL không vượt quá giới hạn |
Dữ liệu cache ~1.3GB | Giữ nguyên hiệu năng hợp lý |
Windows mượt hơn | Ít swap, CPU nhẹ hơn |
Chạy lại lệnh:
SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; SHOW STATUS LIKE 'Innodb_buffer_pool%';
Xem lại kết quả:
innodb_buffer_pool_size
nên hiển thị khoảng 3,221,225,472 bytes (≈ 3GB)Innodb_buffer_pool_pages_total
giảm tương ứng (khoảng 196,608 thay vì 393,216).Vấn đề | Giải thích | Cách xử lý |
---|---|---|
RAM tăng dần 3.5 → 7GB | MySQL giữ bộ nhớ cho cache | Bình thường |
RAM không giảm khi rảnh | MySQL không trả RAM về OS | Bình thường |
RAM giảm khi restart | Do cache bị xóa khi restart | Bình thường |
Máy có 8GB RAM | MySQL chiếm quá cao | Giảm innodb_buffer_pool_size xuống 3G |
Cần ổn định hơn | Giới hạn connection + tắt performance schema | Tối ưu thêm |