Sa Pham

Interested in Cloud Computing, Programming and Security.

Tìm hiểu hugepages trong virtualization

01 Jun 2016 »

#####Tìm hiểu hugepages trong virtualization

#####1.Pagesize

Một Bộ nhớ chính được phân thành một tập các vùng liên tục được gọi là pages. Mặc định kích thước một pages này là 4K bytes. Do vậy khi dung lượng bộ nhớ tăng lên số lượng pages cũng tăng lên rất nhanh.

Ví dụ: Một bộ nhớ RAM 10GB ta sẽ có 2.6 triệu pages.

Các tiến trình thì được CPU cấp phát cho vùng nhớ có địa chỉ nhớ ảo. Khi tiến trình muốn truy cập vào dữ liệu trên bộ nhớ chính nó sẽ sử dụng PageTable để thực hiện việc ánh xạ địa chỉ ảo này sang địa chỉ vật lý.

Việc tìm kiếm và ánh xạ mất rất nhiều thời gian do phải tìm từng pages một. Do vậy người ta đã thiết kế một bộ nhớ cache để lưu trữ các pages được truy cập gần đây nhất gọi là Translation Lookaside Buffer (TLB) nhưng bộ cache này có kích thước rất nhỏ nên vẫn không giải quyết được vấn đề về truy vấn vào bộ nhớ ram.

Do vậy Hugepages đã được phát minh. Đúng với tên gọi, nó là các pages có kích thước lớn.

Ở một số kiến trúc khác nhau sẽ có kích thước pages khác nhau và có thể có nhiều kích thước trên cùng một kiến trúc. Ví dụ x86_64 hỗ trợ 2 kích thước pages là 2MB và 1GB

Làm một phép tính đơn giản ta sẽ thấy nếu ta có bộ nhớ ram 10GB và sử dụng Hugepages size là 2MB thì số pages lúc này sẽ là 5000 pages (ban đầu là 2.6 triệu pages)

Vậy việc tìm kiếm và ánh xạ địa chỉ ảo và địa chỉ vật lý sẽ nhanh hơn do tìm kiếm nhanh hơn

#####2.Paged out

Khi sử dụng TLB làm bộ nhớ đệm. Vì kích thước nhỏ nên khi ta truy xuất vào để ánh xạ địa chỉ vật lý sẽ xảy ra 2 trường hợp. Một là có tồn tại trong TLB và từ đó lấy được địa chỉ vật lý (TLB Hit). Hai là không có trong TLB (TLB miss) do đó CPU sẽ thực hiện tìm kiếm trên PageTable. Và update giá trị ánh xạ mới vào TLB. Nếu bộ nhớ TLB đầy các entry không được sử dụng lâu nhất sẽ bị đẩy ra vùng nhớ khác (swap) ta gọi đó là Paged out.

Khi sử dụng Hugepages các entry này sẽ luôn luôn tồn tại trong Hugepages do vậy không có hiện tượng Paged out.

#####3.Kết luận:

Hugepages sẽ có hai ưu điểm làm tăng tốc hiệu năng của ứng dụng sử dụng nó và có 2 điểm chính cần lưu ý:

  • Pagesize lớn hơn mặc định (4KB): Có thể là 2MB , 1GB , ..

  • Các entry bị locked trong Hugepages và không thể paged out

#####4.Cấu hình trên Ubuntu 14.04 + KVM

Để thực hiện cấu hình cho các VMs trên Hypervisor KVM sử dụng hugepages ta cần enable hugepages bằng việc khai báo các hugepages trong /etc/sysctl.conf

Ví dụ tôi muốn dùng 2GB cho Hugepages ta sẽ cần dùng 1000 pages

Thêm dòng sau

vm.nr_hugepages = 1000

sysctl -p để áp dụng cấu hình

Kiểm tra meminfo

cat /proc/meminfo | grep Huge

Kết quả như sau

  • Hugepages_Total: là tổng số pages

  • Hugepages_Free: Số pages chưa sử dụng

  • Hugepages_Rsvd: Số pages được cấp phát từ pool tạo ra nhưng vẫn chưa được cấp phát. (Ngắn gọn là để dành)

  • Hugepages_Surp: Số hugepages trong pool (dư thừa)

  • Hugepagesize: Kích thước Hugepages

Bước tiếp theo ta enable QEMU-KVM sử dụng Hugepages bằng sửa KVM_HUGEPAGES=1 trong file /etc/default/qemu-kvm

Restart lại libvirt service libvirt-bin restart

#####5.Launch VMs sử dụng hugepages

Mình đang có chạy 1 VM cirros với RAM là 512MB

Mình sẽ edit KVM xml file bằng virsh

virsh edit cirros

thêm đoạn sau

<memoryBacking>
<hugepages/>
</memoryBacking>

Restart vm

virsh destroy cirros
virsh start cirros

Kiểm tra meminfo cat /proc/meminfo | grep Huge

Số Hugepages_Free lúc này là 744 => đã sử dụng 256 pages => 512MB => Bằng số ram của VM cirros