TLB – HugePage …

Tháng Bảy 12, 2008

Translation lookaside buffer (TLB) là CPU cache để cache  các virtual-to-physical memory address translation, TLB được sử dụng bởi memory management

TLB là 1 table gồm chứa các các entry (mỗi entry là Page Table, map từ virtual address sang physical adress ). Nó còn gọi là content-addressable memory (CAM), nếu 1 requested address có trong bảng TLB thì nó sẽ lấy ra xài cò nếu ko có thì translation sẽ diễn ra (bằng cách sử dụng Page Table) nhưng việc translation này sẽ chậm hơn

TLB nằm giữa CPU và CPU cache hoặc nằm giữa CPU cache và primary storage memory, việc này phục thuộc cache sử dụng physical hay virtual address. Nếu cache sử dụng virtual memory, request được send trực tiếp từ CPU đến cache (cache sẽ sử dụng TLB nếu cần). Nếu cache sử dụng physical memory, cứ mỗi khi có memory operation thì CPU sẽ lookup TLB và kết quả là physical adress sẽ được send đến cache

1 cách optimize phổ biến trong việc cache physical address là thực hiện song song TLB lookup với cache access

===============

Huge Page (hay còn gọi là bigpages) là 1 feature trong Linux kernel cho phép memory được manage với những larger page (default thì 1 page chỉ có 4 KB, Default Huge Page là 2MB) 2MB – 4MB. Huge Page được sử dụng cả trong hệ thống 32-bit và 64-bit, việc sử dụng Huge Page ko phụ thuộc vào 32-bit hay 64-bit mà phục thuộc vào lượng memory trong system vì Huge Page chỉ đặc biệt hiệu quả trong system với lượng memory lớn (do lượng memory lớn thì phải đi kèm với 64-bit => huge page thường được sử dụng trong 64-bit system), còn trong hệ thống với memory ít thì nó lại phản tác dụng. Do 1 khi đã sử dụng, các Huge Page là những phần physical memory liên tiếp nhau và sẽ ko bao giời được swap out => dẫn đến việc memory swapping ko hiệu quả

Trong Linux Kernel 2.6, support thêm 1 feature mới là Huge TLB Page, thay thế cho chức năng Huge Page ở trên. Huge TLB cũng giống như Huge Page nhưng nó khác 1 ít trong cơ chế họat động. Vì số lượng entry trong TLB thì rất limited và 1 TLB miss thì rất hao tốn. Do đó, với Huge TLB Page support, mỗi 1 large TLB entry riêng có thể map 1 page nặng 2MB – 4MB, dẫn đến việc giảm số lượng các TLB miss và gia tăng performance. Chức năng Huge Page này rất quan trọng trong các system có hàng GB RAM trở lên và trong các Database System

Các Huge Page được reserve bên trong kernel và được map bởi các large TLB entry, đây là chức năng rất cần thiết trong các database application lớn. User application có thể sử dụng Huge Page thông qua mmap system calls hoặc shared memory system calls

Các Huge Page trong Huge TLB Page phải được cấp phát trước (preallocated) bởi super user

hugepages

Tháng Bảy 10, 2008

Hugepages is a mechanism that allows the Linux kernel to utilise the multiple page size capabilities of modern hardware architectures. Linux uses pages as the basic unit of memory, where physical memory is partitioned and accessed using the basic page unit. The default page size is 4096 Bytes in the x86 architecture. Hugepages allows large amounts of memory to be utilised with a reduced overhead. Linux uses “Transaction Lookaside Buffers” (TLB) in the CPU architecture. These buffers contain mappings of virtual memory to actual physical memory addresses. So utilising a huge amount of physical memory with the default page size consumes the TLB and adds processing overhead. The Linux kernel is able to set aside a portion of physical memory to be able be addressed using a larger page size. Since the page size is higher, there will be less overhead managing the pages with the TLB. In the Linux 2.6 series of kernels, hugepages is enabled using the CONFIG_HUGETLB_PAGE feature when the kernel is built. Systems with large amount of memory can be configured to utilise the memory more efficiently by setting aside a portion dedicated for hugepages. The actual size of the page is dependent on the system architecture. A typical x86 system will have a Huge Page Size of 2048 kBytes. The huge page size may be found by looking at the /proc/meminfo :

# cat /proc/meminfo |grep Hugepagesize Hugepagesize: 2048 kB

Number of Hugepages can be allocated using the /proc/sys/vm/nr_hugepages entry, or by using the sysctl command.

To view the current setting using the /proc entry:
# cat /proc/sys/vm/nr_hugepages 0

To view the current setting using the sysctl command:
# sysctl vm.nr_hugepages vm.nr_hugepages = 0

To set the number of huge pages using /proc entry:
# echo 5 > /proc/sys/vm/nr_hugepages

To set the number of hugepages using sysctl:
# sysctl -w vm.nr_hugepages=5 vm.nr_hugepages = 5

It may be necessary to reboot to be able to allocate the number of hugepages that is needed. This is because hugepages requires large areas of contiguous physical memory. Over time, physical memory may be mapped and allocated to pages, thus the physical memory can become fragmented. If the hugepages are allocated early in the boot process, fragmentation is unlikely to have occurred.

It is recommended that the /etc/sysctl.conf file should be used to allocate hugepages at boot time. For example, to allocate 5 hugepages at boot time add the line below to the sysctl.conf file :

vm.nr_hugepages = 5

Increasing swap performance

Tháng Bảy 9, 2008

If your Linux machine is configured with several swap partitions, the default trend is to use of one partition at a time. Once one swap partition has been full the next will be used. This is not always the best method for performance, since when a new process needs to be swapped to disk it may be forced to wait until another process is swapped out.


For instance, if there are two swap partitions specified in /etc/fstab it will look something like this:

/dev/sda2    swap     swap    defaults           0 0
/dev/sda3    swap     swap    defaults           0 0

Change the mount options section from ”defaults” to ”pri=0” :

/dev/sda2    swap      swap    pri=0           0 0
/dev/sda3 swap swap pri=0 0 0
If you want to do this in a live system, then swapoff and swapon with “-p 0” option for each swap device – one by one. Once this has been done the system will be able to access any of the designated swap partitions independently of the others. This can increase the swap performance of a machine which is regularly swapping memory to disk. However it is important to bear in mind that in most situations a machine should not make heavy use of swap partitions.