mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-21 23:21:59 +00:00
support determine available memory for FreeBSD
This commit is contained in:
parent
7ea3c003d5
commit
0f66743104
@ -2,6 +2,7 @@ set (SRCS
|
|||||||
argsToConfig.cpp
|
argsToConfig.cpp
|
||||||
coverage.cpp
|
coverage.cpp
|
||||||
demangle.cpp
|
demangle.cpp
|
||||||
|
getAvailableMemoryAmount.cpp
|
||||||
getFQDNOrHostName.cpp
|
getFQDNOrHostName.cpp
|
||||||
getMemoryAmount.cpp
|
getMemoryAmount.cpp
|
||||||
getPageSize.cpp
|
getPageSize.cpp
|
||||||
|
41
base/base/getAvailableMemoryAmount.cpp
Normal file
41
base/base/getAvailableMemoryAmount.cpp
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
#include <stdexcept>
|
||||||
|
#include <fstream>
|
||||||
|
#include <base/getAvailableMemoryAmount.h>
|
||||||
|
#include <base/getPageSize.h>
|
||||||
|
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/param.h>
|
||||||
|
#if defined(BSD)
|
||||||
|
#include <sys/sysctl.h>
|
||||||
|
#include <sys/vmmeter.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
uint64_t getAvailableMemoryAmountOrZero()
|
||||||
|
{
|
||||||
|
int64_t page_size = getPageSize();
|
||||||
|
if (page_size <= 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
#if defined(__FreeBSD__)
|
||||||
|
struct vmtotal vmt;
|
||||||
|
size_t vmt_size = sizeof(vmt);
|
||||||
|
if (sysctlbyname("vm.vmtotal", &vmt, &vmt_size, NULL, 0) < 0)
|
||||||
|
return 0;
|
||||||
|
uint64_t available_pages = vmt.t_avm;
|
||||||
|
#else
|
||||||
|
uint64_t available_pages = sysconf(_SC_AVPHYS_PAGES);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return page_size * available_pages;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
uint64_t getAvailableMemoryAmount()
|
||||||
|
{
|
||||||
|
auto res = getAvailableMemoryAmountOrZero();
|
||||||
|
if (!res)
|
||||||
|
throw std::runtime_error("Cannot determine available memory amount");
|
||||||
|
return res;
|
||||||
|
}
|
12
base/base/getAvailableMemoryAmount.h
Normal file
12
base/base/getAvailableMemoryAmount.h
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
/** Returns the size of currently available physical memory (RAM) in bytes.
|
||||||
|
* Returns 0 on unsupported platform or if it cannot determine the size of physical memory.
|
||||||
|
*/
|
||||||
|
uint64_t getAvailableMemoryAmountOrZero();
|
||||||
|
|
||||||
|
/** Throws exception if it cannot determine the size of physical memory.
|
||||||
|
*/
|
||||||
|
uint64_t getAvailableMemoryAmount();
|
@ -20,6 +20,7 @@
|
|||||||
#include <base/phdr_cache.h>
|
#include <base/phdr_cache.h>
|
||||||
#include <base/ErrorHandlers.h>
|
#include <base/ErrorHandlers.h>
|
||||||
#include <base/getMemoryAmount.h>
|
#include <base/getMemoryAmount.h>
|
||||||
|
#include <base/getAvailableMemoryAmount.h>
|
||||||
#include <base/errnoToString.h>
|
#include <base/errnoToString.h>
|
||||||
#include <base/coverage.h>
|
#include <base/coverage.h>
|
||||||
#include <Common/ClickHouseRevision.h>
|
#include <Common/ClickHouseRevision.h>
|
||||||
@ -588,8 +589,14 @@ static void sanityChecks(Server* server)
|
|||||||
if (getBlockDeviceType(dev_id) == BlockDeviceType::ROT && getBlockDeviceReadAheadBytes(dev_id) == 0)
|
if (getBlockDeviceType(dev_id) == BlockDeviceType::ROT && getBlockDeviceReadAheadBytes(dev_id) == 0)
|
||||||
server->context()->addWarningMessage("Rotational disk with disabled readahead is in use. Performance can be degraded.");
|
server->context()->addWarningMessage("Rotational disk with disabled readahead is in use. Performance can be degraded.");
|
||||||
#endif
|
#endif
|
||||||
if (sysconf(_SC_AVPHYS_PAGES) * sysconf(_SC_PAGE_SIZE) < (2l << 30))
|
try
|
||||||
server->context()->addWarningMessage("Available memory at server startup is too low (2GiB).");
|
{
|
||||||
|
if (getAvailableMemoryAmount() < (2l << 30))
|
||||||
|
server->context()->addWarningMessage("Available memory at server startup is too low (2GiB).");
|
||||||
|
}
|
||||||
|
catch (...)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
if (!enoughSpaceInDirectory(data_path, 1ull << 30))
|
if (!enoughSpaceInDirectory(data_path, 1ull << 30))
|
||||||
server->context()->addWarningMessage("Available disk space at server startup is too low (1GiB).");
|
server->context()->addWarningMessage("Available disk space at server startup is too low (1GiB).");
|
||||||
|
Loading…
Reference in New Issue
Block a user