Quay lại danh sách
Tin tức công nghệ

Tối ưu hóa bộ nhớ Keycloak Auth Server trên VPS Linux 1GB RAM bằng Quarkus Tuning

2 tháng 6, 2026

Đặt vấn đề: Thử thách triển khai Keycloak trên hạ tầng giới hạn

Trong hệ sinh thái phát triển phần mềm hiện đại, Keycloak đã trở thành một giải pháp quản lý định danh và truy cập (IAM) mã nguồn mở tiêu chuẩn nhờ tính bảo mật cao và khả năng hỗ trợ đa giao thức như OAuth2, OIDC và SAML. Tuy nhiên, một trong những rào cản lớn nhất đối với các doanh nghiệp khởi nghiệp hoặc các dự án nhỏ (SMEs) là gánh nặng về chi phí hạ tầng. Keycloak, vốn chạy trên nền tảng Java (JVM), nổi tiếng là "sát thủ phần cứng" và thường yêu cầu cấu hình tối thiểu từ 2GB đến 4GB RAM để vận hành ổn định.

Khi cố gắng triển khai Keycloak trên một VPS Linux cấu hình thấp (chỉ 1GB RAM), hệ thống rất dễ rơi vào trạng thái cạn kiệt tài nguyên. Hậu quả là tiến trình Keycloak liên tục bị cơ chế Out-Of-Memory (OOM) Killer của Linux chấm dứt đột ngột, gây gián đoạn toàn bộ dịch vụ xác thực của doanh nghiệp. May mắn thay, kể từ phiên bản 17, Keycloak đã chuyển dịch hoàn toàn sang phân phối mới dựa trên Quarkus — một framework Java Cloud-Native tối ưu hóa siêu đỉnh cho container và bộ nhớ thấp. Bài viết này sẽ hướng dẫn bạn từng bước tối ưu hóa chuyên sâu (Tuning) Keycloak Quarkus để chạy an toàn, mượt mà trên môi trường 1GB RAM.

---

1. Chiến lược phân bổ bộ nhớ tổng thể trên VPS 1GB RAM

Để tối ưu hóa thành công, chúng ta cần hiểu rõ bài toán phân chia chiếc bánh tài nguyên 1GB RAM (tương đương khoảng 1024MB) cho toàn bộ hệ điều hành và các tiến trình phụ thuộc. Một sai lầm phổ biến là cấp phát quá nhiều RAM cho JVM, dẫn đến việc hệ điều hành Linux không còn đủ bộ nhớ cho các tác vụ cơ bản.

Bảng phân bổ tài nguyên khuyến nghị cho VPS 1GB RAM:

  • Hệ điều hành Linux & Các dịch vụ nền: 250MB – 300MB
  • Cơ sở dữ liệu (PostgreSQL/MySQL thu nhỏ): 150MB – 200MB
  • Keycloak JVM Heap Size: 350MB – 400MB
  • Keycloak Non-Heap (Metaspace, Threads): 150MB
Quy tắc vàng: Tổng lượng RAM thực tế sử dụng không được vượt quá 85% dung lượng vật lý của VPS để tránh hiện tượng nghẽn cổ chai hệ thống.
---

2. Cấu hình Swap Space - Lưới đỡ an toàn bắt buộc

Trên một VPS có dung lượng RAM cực kỳ hạn chế, việc kích hoạt Swap Space (bộ nhớ ảo trên ổ đĩa) là bước bắt buộc. Dù tốc độ đọc ghi của Swap (ngay cả trên ổ SSD) chậm hơn RAM vật lý rất nhiều, nhưng nó hoạt động như một "lưới bảo hiểm" giúp hệ thống không bị crash khi có lượng người dùng truy cập đột biến.

Hãy thực hiện các lệnh sau với quyền root để tạo 2GB Swap:

sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

Để đảm bảo Swap tự động kích hoạt sau khi khởi động lại VPS, hãy thêm dòng sau vào tệp /etc/fstab:

/swapfile swap swap defaults 0 0

Tiếp theo, điều chỉnh giá trị swappiness. Mặc định Linux đặt giá trị này là 60 (khá hung hăng trong việc chuyển dữ liệu sang Swap). Đối với VPS tối ưu hóa Keycloak, chúng ta nên giảm xuống 10 hoặc 15 để ưu tiên sử dụng RAM vật lý tối đa trước khi dùng đến Swap:

sudo sysctl vm.swappiness=10
---

3. Tối ưu hóa JVM và Quarkus cho Keycloak

Đây là phần cốt lõi của quá trình tối ưu hóa. Chúng ta sẽ can thiệp trực tiếp vào cấu hình khởi chạy của Java Virtual Machine (JVM) thông qua các tham số môi trường hoặc tệp cấu hình của Keycloak.

3.1. Giới hạn Heap Size hợp lý

Nếu không được cấu hình cụ thể, JVM sẽ tự động tính toán Heap Size dựa trên tổng dung lượng hệ thống, điều này thường dẫn đến việc vượt quá mức cho phép trên VPS 1GB. Chúng ta cần ép buộc JVM hoạt động trong không gian từ 350MB đến 400MB bằng các tham số -Xms (kích thước khởi tạo) và -Xmx (kích thước tối đa).

Nên đặt -Xms bằng -Xmx để tránh việc JVM phải liên tục thực hiện hành động cấp phát và giải phóng bộ nhớ với hệ điều hành, giúp tiết kiệm CPU chu kỳ:

KC_HTTPS_PORT=8443
JAVA_OPTS="-Xms350m -Xmx350m -XX:MaxMetaspaceSize=150m"

3.2. Lựa chọn Garbage Collector (Bộ thu gom rác) phù hợp

Mặc định, các phiên bản Java hiện đại sử dụng G1GC (Garbage-First Garbage Collector). G1GC rất tốt cho các hệ thống lớn, nhưng nó lại ngốn khá nhiều bộ nhớ để duy trì các cấu trúc dữ liệu nội bộ. Đối với môi trường siêu nhỏ dưới 1GB RAM, Serial Garbage Collector (-XX:+UseSerialGC) là sự lựa chọn tối ưu nhất. Serial GC hoạt động theo cơ chế đơn luồng, tiêu tốn cực kỳ ít tài nguyên bộ nhớ bổ sung.

Cập nhật lại biến môi trường JAVA_OPTS đầy đủ:

export JAVA_OPTS="-Xms350m -Xmx350m -XX:MaxMetaspaceSize=120m -XX:+UseSerialGC -XX:MaxRAMPercentage=40.0"
---

4. Tối ưu hóa cấu hình nội tại của Keycloak (conf/keycloak.conf)

Bên cạnh cấu hình hạ tầng JVM, bản thân các tính năng của Keycloak cũng cần được tinh chỉnh gọn gàng để loại bỏ các tính năng không cần thiết, giảm tải cho Quarkus.

4.1. Vô hiệu hóa các tính năng thừa (Features Tuning)

Keycloak đi kèm với rất nhiều tính năng mặc định được bật sẵn. Đối với một server auth cơ bản, bạn có thể tắt bớt các tính năng như impersonation, authorization, hoặc các tính năng preview để tiết kiệm RAM. Sửa tệp conf/keycloak.conf:

features-disabled=authorization,impersonation

4.2. Cấu hình Connection Pool cho Database

Mặc định Keycloak thiết lập số lượng kết nối tối đa đến cơ sở dữ liệu khá cao. Trên VPS 1GB, việc duy trì quá nhiều kết nối mở song song sẽ làm tê liệt cả Keycloak lẫn Database. Hãy giới hạn số lượng kết nối vừa đủ cho lượng tải nhỏ:

db-pool-initial-size=5
db-pool-max-size=10
db-pool-min-size=5

4.3. Giảm số lượng Thread xử lý HTTP

Quarkus sử dụng Vert.x cho tầng mạng IO. Hãy giới hạn số lượng worker threads để tránh tình trạng context switching quá nhiều gây tốn RAM và CPU:

http-max-queued-requests=500
http-pool-max-threads=50
---

5. Kiểm tra, Giám sát và Đánh giá hiệu năng

Sau khi đã áp dụng tất cả các thiết lập trên, hãy tiến hành build lại Keycloak để Quarkus tối ưu hóa ở chế độ production:

bin/kc.sh build
bin/kc.sh start --optimized

Để kiểm tra xem hệ thống hoạt động ra sao, bạn hãy sử dụng lệnh top hoặc htop trên Linux. Kiểm tra cột RES (Resident Memory) của tiến trình Java. Nếu cấu hình đúng, lượng RAM thực tế của Keycloak sẽ duy trì ổn định xung quanh mức 500MB - 550MB (bao gồm cả Heap và Non-Heap).

Kiểm thử tải (Load Testing) giả lập

Bạn nên sử dụng các công cụ như Apache Benchmark (ab) hoặc k6 để giả lập khoảng 20-50 request đăng nhập đồng thời. Quan sát xem biểu đồ RAM có bị tăng phi mã (Memory Leak) hay không và hệ thống có phản hồi trong thời gian dưới 200ms hay không. Nếu hệ thống ổn định dưới áp lực này, bạn đã hoàn tất quá trình tuning thành công.

---

Lời kết

Tối ưu hóa Keycloak chạy trên VPS 1GB RAM không phải là việc bất khả thi nếu chúng ta biết tận dụng sức mạnh kiến trúc của Quarkus kết hợp với việc tinh chỉnh JVM và hệ điều hành hợp lý. Bằng cách áp dụng đúng các bước thiết lập SerialGC, giới hạn Heap Size, tạo Swap và cấu hình tối giản các tính năng, doanh nghiệp của bạn hoàn toàn có thể sở hữu một hệ thống Identity Server mạnh mẽ, bảo mật với mức chi phí vận hành hạ tầng rẻ nhất có thể.

Tối ưu hóa bộ nhớ Keycloak Auth Server trên VPS Linux 1GB RAM bằng Quarkus Tuning | DPTCloud