пятница, 12 марта 2010 г.

Hugepages патч

Так, вроде, в первом приближении сделал. Баги тоже должны быть.

http://paste.lisp.org/display/96287

Запускать так:

# echo 200 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
# mkdir /dev/huge
# mount -t hugetlbfs none /dev/huge -o size=800M,mode=777
$ sbcl --hugetlbfs-path /dev/huge --huge-pages-nr 200
 
Тут создаётся 800 мб больших страниц и SBCL'ю говорится, где смонтирована hugetlbfs, и сколько страниц доступно. Есть fallback на обычную память.

Доработка для других осей, в которых возможно использование POSIX-интерфейса к жирным страницам, сводится к (на примере Линукса):

diff --git a/src/runtime/linux-os.c b/src/runtime/linux-os.c
index 9b2e3cf..386fc25 100644
--- a/src/runtime/linux-os.c
+++ b/src/runtime/linux-os.c
@@ -56,6 +56,8 @@
 #include "cheneygc-internal.h"
 #endif
 
+#include "hugepages.h"
+
 #ifdef LISP_FEATURE_X86
 /* Prototype for personality(2). Done inline here since the header file
  * for this isn't available on old versions of glibc. */
@@ -313,7 +315,10 @@ os_validate(os_vm_address_t addr, os_vm_size_t len)
         addr=under_2gb_free_pointer;
     }
 #endif
-    actual = mmap(addr, len, OS_VM_PROT_ALL, flags, -1, 0);
+    actual = huge_page_validate(addr, len);
+    if (!actual)
+        actual = mmap(addr, len, OS_VM_PROT_ALL, flags, -1, 0);
+
     if (actual == MAP_FAILED) {
         perror("mmap");
         return 0;               /* caller should check this */
@@ -337,6 +342,7 @@ os_validate(os_vm_address_t addr, os_vm_size_t len)
 void
 os_invalidate(os_vm_address_t addr, os_vm_size_t len)
 {
+    huge_page_invalidate(addr, len);
     if (munmap(addr,len) == -1) {
         perror("munmap");
     }

Т.е. нужно всего-то подключить хидер и чуть-чуть модифицировать os_validate и os_invalidate.

7 комментариев:

  1. > Доработка для других осей, в которых возможно использование POSIX-интерфейса к жирным страницам, сводится к (на примере Линукса)

    А где это запускалось без доработки?

    ОтветитьУдалить
  2. Отлично, заюзаю на новом серваке, когда он приедет :)

    ОтветитьУдалить
  3. Сборщик мусора нужно фиксить, он больших страниц пугается и начинает медленно работать.

    ОтветитьУдалить
  4. То есть везде нужно ведро перекомпилировать?

    ОтветитьУдалить
  5. Какое ядро? Патч накладывается на SBCL.

    ОтветитьУдалить
  6. > Доработка для других осей, в которых возможно использование POSIX-интерфейса к жирным страницам, сводится к (на примере Линукса):

    Мне это предложение парсер поломало. Я думал на чём же sbcl тогда запускалось. :)
    Теперь понятно, что на линуксе всё работает и так, а этот патч -- пример портирования на другие OS.
    Чтож, огромные страницы -- это хорошо.

    ОтветитьУдалить

Архив блога