Khi tham gia cuộc thi thiết kế cơ sở dữ liệu trong khuôn khổ kỳ thi năng lực hệ thống máy tính, mình đã tiếp thu được rất nhiều kiến thức thực tế. Cuộc thi sử dụng PolarDB (một phiên bản tùy chỉnh của PostgreSQL), và gần đây khi làm việc trên nền tảng Huawei Cloud, mình cũng dùng OpenGauss – vốn cũng dựa trên PostgreSQL. Có thể nói PostgreSQL thực sự là "thánh" trong thế giới mã nguồn mở.
Trong quá trình triển khai, do tài nguyên máy chủ hạn chế, một lỗi phổ biến thường gặp phải là: FATAL: could not create shared memory segment: Cannot allocate memory. Dưới đây là hai cách xử lý hiệu quả cho vấn đề này.
1. Sửa tay thông số trong file cấu hình
Phương án này phù hợp khi bạn điều chỉnh thông số hệ thống bằng lệnh ALTER SYSTEM trong psql, sau đó khởi động lại dịch vụ bằng pg_ctl nhưng gặp lỗi cấp phát bộ nhớ. Trong các hệ thống như PolarDB, file postgres.auto.conf sẽ lưu lại các tham số đã được thay đổi qua môi trường truy vấn.
Nếu bạn dùng VS Code để quản lý server, có thể dùng tổ hợp phím Ctrl+P để tìm nhanh file này. Mở file và tìm đến tham số shared_buffers, giảm giá trị xuống mức phù hợp với tài nguyên hiện tại – ví dụ 2GB – thường sẽ giúp CSDL khởi động thành công:
shared_buffers = 2GB
Sau khi sửa xong, dùng lệnh pg_ctl start để thử khởi động lại dịch vụ.
2. Tạo phân vùng hoán đổi (swap) tạm thời
Trường hợp máy chủ chỉ có dung lượng RAM rất nhỏ (ví dụ như ECS instance trên Huawei Cloud với chỉ 4GB RAM), ngay cả khi đã tối ưu bộ nhớ, vẫn không đủ để đáp ứng yêu cầu khởi động cơ sở dữ liệu, bạn có thể dùng giải pháp tạo thêm bộ nhớ ảo thông qua swap.
Dưới đây là chuỗi lệnh tạo một file swap 1GB:
sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
Sau khi thực thi, hệ thống sẽ có thêm bộ nhớ ảo từ ổ cứng, giúp PostgreSQL khởi động thành công.
Swap hoạt động như thế nào?
Swap là một cơ chế trong Linux dùng để mở rộng khả năng lưu trữ bộ nhớ khi RAM vật lý đạt giới hạn. Khi hệ thống thiếu RAM, các tiến trình ít hoạt động sẽ được chuyển tạm ra ổ đĩa, nhường chỗ cho các tác vụ quan trọng hơn.
- Ngăn sập hệ thống: Khi RAM đầy, swap giúp tránh tình trạng OOM (Out of Memory), ngăn tiến trình bị kill đột ngột.
- Tăng độ ổn định: Đặc biệt hữu ích trên các máy chủ chạy nhiều dịch vụ cùng lúc.
- Quản lý bộ nhớ thông minh: Linux tự động đưa các page bộ nhớ không dùng vào swap, khi cần thì tải lại vào RAM.
Nhược điểm cần lưu ý
Vì tốc độ truy xuất ổ cứng (kể cả SSD) chậm hơn rất nhiều so với RAM, nếu hệ thống liên tục đọc/ghi vào swap, hiệu năng sẽ giảm rõ rệt. Do đó, swap chỉ nên là giải pháp tạm thời, không thể thay thế RAM thật.
Khi nào nên bật swap?
- Máy chủ có RAM ≤ 4GB
- Chạy nhiều dịch vụ đồng thời (như web server, DB, cache)
- Môi trường container hoặc máy ảo
Hướng dẫn cấu hình swap chi tiết
- Tạo file swap:
sudo fallocate -l 1G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile - Kiểm tra trạng thái:
free -h swapon --show - Thiết lập khởi động cùng hệ thống: Thêm dòng sau vào file
/etc/fstab:/swapfile none swap sw 0 0
Cơ chế swap giúp tăng khả năng chịu tải trong điều kiện phần cứng hạn chế, tuy nhiên nên cân nhắc nâng cấp RAM thật nếu ứng dụng yêu cầu hiệu năng cao lâu dài.