Simply record the time from entering `main` to start listening sockets.
global_context->setApplicationType(Context::ApplicationType::SERVER);
#if !defined(NDEBUG) || !defined(__OPTIMIZE__)
    global_context->addWarningMessage("Server was built in debug mode. It will work slowly.");
#endif
    if (ThreadFuzzer::instance().isEffective())
        global_context->addWarningMessage("ThreadFuzzer is enabled. Application will run slowly and unstable.");
#if defined(SANITIZER)
    global_context->addWarningMessage("Server was built with sanitizer. It will work slowly.");
#endif
    const auto memory_amount = getMemoryAmount();
    LOG_INFO(log, "Available RAM: {}; physical cores: {}; logical cores: {}.",
        formatReadableSizeWithBinarySuffix(memory_amount),
        getNumberOfPhysicalCPUCores(),  
        std::thread::hardware_concurrency());
    sanityChecks(*this);
    
    
    
    GlobalThreadPool::initialize(
        config().getUInt("max_thread_pool_size", 10000),
        config().getUInt("max_thread_pool_free_size", 1000),
        config().getUInt("thread_pool_queue_size", 10000));
    IOThreadPool::initialize(
        config().getUInt("max_io_thread_pool_size", 100),
        config().getUInt("max_io_thread_pool_free_size", 0),
        config().getUInt("io_thread_pool_queue_size", 10000));
    NamedCollectionUtils::loadFromConfig(config());
    
    if (config().has("local_cache_for_remote_fs"))
    {