dbms: using huge pages everywhere (experimental) [#METR-2944].

This commit is contained in:
Alexey Milovidov 2015-08-16 17:44:02 +03:00
parent f0a5ec4736
commit f68478b638
3 changed files with 19 additions and 18 deletions

View File

@ -21,7 +21,6 @@ private:
/** См. комментарий в HashTableAllocator.h
*/
static constexpr size_t MMAP_THRESHOLD = 64 * (1 << 20);
static constexpr size_t HUGE_PAGE_SIZE = 2 * (1 << 20);
static constexpr size_t MMAP_MIN_ALIGNMENT = 4096;
static constexpr size_t MALLOC_MIN_ALIGNMENT = 8;
@ -42,10 +41,6 @@ public:
buf = mmap(NULL, size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (MAP_FAILED == buf)
DB::throwFromErrno("Allocator: Cannot mmap.", DB::ErrorCodes::CANNOT_ALLOCATE_MEMORY);
/// См. комментарий в HashTableAllocator.h
if (size >= HUGE_PAGE_SIZE && 0 != madvise(buf, size, MADV_HUGEPAGE))
DB::throwFromErrno("HashTableAllocator: Cannot madvise with MADV_HUGEPAGE.", DB::ErrorCodes::CANNOT_ALLOCATE_MEMORY);
}
else
{

View File

@ -36,7 +36,6 @@ private:
* PS. Также это требуется, потому что tcmalloc не может выделить кусок памяти больше 16 GB.
*/
static constexpr size_t MMAP_THRESHOLD = 64 * (1 << 20);
static constexpr size_t HUGE_PAGE_SIZE = 2 * (1 << 20);
public:
/// Выделить кусок памяти и заполнить его нулями.
@ -53,14 +52,6 @@ public:
if (MAP_FAILED == buf)
DB::throwFromErrno("HashTableAllocator: Cannot mmap.", DB::ErrorCodes::CANNOT_ALLOCATE_MEMORY);
/** Использование huge pages позволяет увеличить производительность более чем в три раза
* в запросе SELECT number % 1000000 AS k, count() FROM system.numbers GROUP BY k,
* (хэш-таблица на 1 000 000 элементов)
* и примерно на 15% в случае хэш-таблицы на 100 000 000 элементов.
*/
if (size >= HUGE_PAGE_SIZE && 0 != madvise(buf, size, MADV_HUGEPAGE))
DB::throwFromErrno("HashTableAllocator: Cannot madvise with MADV_HUGEPAGE.", DB::ErrorCodes::CANNOT_ALLOCATE_MEMORY);
/// Заполнение нулями не нужно - mmap сам это делает.
}
else
@ -117,10 +108,6 @@ public:
if (MAP_FAILED == buf)
DB::throwFromErrno("HashTableAllocator: Cannot mremap.", DB::ErrorCodes::CANNOT_MREMAP);
/** Здесь не получается сделать madvise с MADV_HUGEPAGE.
* Похоже, что при mremap, huge pages сами расширяются на новую область.
*/
/// Заполнение нулями не нужно.
}
else

View File

@ -44,6 +44,8 @@
#include <zkutil/ZooKeeper.h>
#include <gperftools/malloc_hook.h>
#include "Server.h"
#include "HTTPHandler.h"
#include "InterserverIOHTTPHandler.h"
@ -424,6 +426,23 @@ int Server::main(const std::vector<std::string> & args)
{
Logger * log = &logger();
/** Использование huge pages позволяет увеличить производительность более чем в три раза
* в запросе SELECT number % 1000000 AS k, count() FROM system.numbers GROUP BY k,
* (хэш-таблица на 1 000 000 элементов)
* и примерно на 15% в случае хэш-таблицы на 100 000 000 элементов.
*/
if (!MallocHook::AddMmapHook([](const void * result, const void * start, size_t size, int protection, int flags, int fd, off_t offset)
{
const auto HUGE_PAGE_SIZE = 1 << 21;
if (result != MAP_FAILED
&& size >= HUGE_PAGE_SIZE
&& (flags & MAP_PRIVATE)
&& (flags & MAP_ANONYMOUS))
(void)madvise(const_cast<void *>(result), size, MADV_HUGEPAGE);
}))
LOG_WARNING(log, "Cannot set mmap hook.");
std::string path = config().getString("path");
Poco::trimInPlace(path);
if (path.empty())