gpt4 book ai didi

c++ - LevelDB:IO 错误:XXX.sst:打开的文件太多

转载 作者:搜寻专家 更新时间:2023-10-30 23:13:45 24 4
gpt4 key购买 nike

我在包含 5 个数据库的应用程序中使用 LevelDB。每个数据库都使用选项 max_open_files = 64 打开。

ulimit -Sn 显示操作系统有 1024 个文件的限制。将限制设置为 2048 可解决此问题。因为我将此应用程序分发给人们,所以它应该具有开箱即用的默认值,而不需要人们配置他们的操作系统。

leveldb::Status status = db_spends_->Get(
leveldb::ReadOptions(), spent_slice, &raw_spend);
if (!status.ok())
{
std::cerr << "fetch_spend: " << status.ToString() << std::endl;
return false;
}

我遇到了很多这样的错误,根本无法阅读。

"fetch_spend: IO error: XXXX.sst: Too many open files"

database 子目录下有 5 个数据库:

$ ls
addr block block_hash spend tx
$ du -sh .
16G .
$ du -sh *
2.6G addr
653M block
7.2M block_hash
2.6G spend
9.4G tx
$ for i in `ls`; do echo $i; ls $i | wc -l; done
addr
1279
block
333
block_hash
10
spend
1433
tx
5252

我想更改 LevelDB 中每个 .sst 文件的 2 MB 限制,但它似乎不可调整,我只在 Google 上看到这个补丁:https://github.com/basho/leveldb/pull/7

我正在使用 Ubuntu 13.04 64 位。

这是我用来打开数据库的代码。如果我在调用 leveldb::DB::Open() 之前显示 open_options.max_open_files,它会显示 64(如预期)。

bool open_db(const std::string& prefix, const std::string& db_name,
std::unique_ptr<leveldb::DB>& db, leveldb::Options open_options)
{
using boost::filesystem::path;
path db_path = path(prefix) / db_name;
leveldb::DB* db_base_ptr = nullptr;
leveldb::Status status =
leveldb::DB::Open(open_options, db_path.native(), &db_base_ptr);
if (!status.ok())
{
log_fatal(LOG_BLOCKCHAIN) << "Internal error opening '"
<< db_name << "' database: " << status.ToString();
return false;
}
// The cointainer ensures db_base_ptr is now managed.
db.reset(db_base_ptr);
return true;
}

...

// Create comparator for blocks database.
depth_comparator_.reset(new depth_comparator);
// Open LevelDB databases
const size_t cache_size = 1 << 20;
// block_cache, filter_policy and comparator must be deleted after use!
open_options_.block_cache = leveldb::NewLRUCache(cache_size / 2);
open_options_.write_buffer_size = cache_size / 4;
open_options_.filter_policy = leveldb::NewBloomFilterPolicy(10);
open_options_.compression = leveldb::kNoCompression;
open_options_.max_open_files = 64;
open_options_.create_if_missing = true;
// The blocks database options needs its depth comparator too.
leveldb::Options blocks_open_options = open_options_;
blocks_open_options.comparator = depth_comparator_.get();
if (!open_db(prefix, "block", db_blocks_, blocks_open_options))
return false;
if (!open_db(prefix, "block_hash", db_blocks_hash_, open_options_))
return false;
if (!open_db(prefix, "tx", db_txs_, open_options_))
return false;
if (!open_db(prefix, "spend", db_spends_, open_options_))
return false;
if (!open_db(prefix, "addr", db_address_, open_options_))
return false;

即使我设置了 max_open_files = 20,我仍然会遇到同样的问题。

最佳答案

直到最近,当 max_option_files 设置为 < 74 时,可能会出现一些病态行为,其中使用了数百个文件描述符,而不是选项所说的内容。 (最新版本的 leveldb clamps 给出了 74 层的限制。)将其设置为 ~80 有什么影响吗?如果没有,您仍然遇到问题,当您看到不良行为时,您能否运行适当的 lsof 咒语?这将告诉我们文件描述符的去向。

关于c++ - LevelDB:IO 错误:XXX.sst:打开的文件太多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17021334/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com