- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我对日志结构化合并树(LSM 树)的理解是,它利用了追加到磁盘的速度非常快(因为它不需要查找)这一事实,只需将更新追加到预写日志并返回到客户端。 我的理解是,这仍然提供即时持久性,同时仍然非常快。
Redis,我不认为它使用 LSM 树,似乎有一种模式,你可以在每次写入时进行 AOF+fsync。 https://redis.io/topics/latency .文档说:
AOF + fsync always: this is very slow, you should use it only if you know what you are doing.
我很困惑为什么这会很慢,因为原则上你仍然只是在每次更新时附加到一个文件,就像像 Cassandra 这样的 LSM-tree 数据库正在做的。
最佳答案
LSM 是 AOF,您有时想真正阅读它。你做了一些开销工作,这样你以后可以更快地阅读它。 Redis 的设计使您永远不会或仅在特殊情况下阅读它。另一方面,Cassandra 经常读取它来满足请求。
对于像 Cassandra 这样的数据库来说,Redis 所说的慢实际上非常非常快。
事实证明,我下结论太早了。从设计的角度来看,以上所有内容都是正确的,但实现差异很大。尽管 Cassandra 声称绝对持久性,但它不会对每个事务进行 fsync
并且没有办法强制它这样做(但每个事务都可以 fsynced)。我能做的最好的事情是“在上一次 fsync 之后至少 1ms 以批处理模式进行 fsync”。这意味着我使用的 4 线程基准测试是每次 fsync 进行 4 次写入,并且线程正在等待 fsync 完成。另一方面,Redis 在每次写入时都执行 fsync,所以频率是原来的 4 倍。随着更多线程和表分区的增加,Cassandra 可能会赢得更大的胜利。但请注意,您描述的用例并不典型。其他架构差异(Cassandra 擅长分区,Redis 擅长计数器,LUA 等)仍然适用。
Redis 命令:set(KEY + (tstate.i++), TEXT);
Cassandra 命令:execute("insert into test.test (id,data) values (?,?)", state.i++, TEXT)
TEXT = "醒醒,Neo。我们已经更新了我们的隐私政策。"
Redis 每秒 fsync,HDD
Benchmark (address) Mode Cnt Score Error Units
LettuceThreads.shared localhost thrpt 15 97535.900 ± 2188.862 ops/s
97535.900 ±(99.9%) 2188.862 ops/s [Average]
(min, avg, max) = (94460.868, 97535.900, 100983.563), stdev = 2047.463
CI (99.9%): [95347.038, 99724.761] (assumes normal distribution)
Redis fsync 每次写入,HDD
Benchmark (address) Mode Cnt Score Error Units
LettuceThreads.shared localhost thrpt 15 48.862 ± 2.237 ops/s
48.862 ±(99.9%) 2.237 ops/s [Average]
(min, avg, max) = (47.912, 48.862, 56.351), stdev = 2.092
CI (99.9%): [46.625, 51.098] (assumes normal distribution)
Redis, fsync every write, NVMe (Samsung 960 PRO 1tb)
Benchmark (address) Mode Cnt Score Error Units
LettuceThreads.shared remote thrpt 15 449.248 ± 6.475 ops/s
449.248 ±(99.9%) 6.475 ops/s [Average]
(min, avg, max) = (441.206, 449.248, 462.817), stdev = 6.057
CI (99.9%): [442.773, 455.724] (assumes normal distribution)
Cassandra,每秒 fsync,HDD
Benchmark Mode Cnt Score Error Units
CassandraBenchMain.write thrpt 15 12016.250 ± 601.811 ops/s
12016.250 ±(99.9%) 601.811 ops/s [Average]
(min, avg, max) = (10237.077, 12016.250, 12496.275), stdev = 562.935
CI (99.9%): [11414.439, 12618.062] (assumes normal distribution)
Cassandra,每批 fsync,但至少等待 1ms,HDD
Benchmark Mode Cnt Score Error Units
CassandraBenchMain.write thrpt 15 195.331 ± 3.695 ops/s
195.331 ±(99.9%) 3.695 ops/s [Average]
(min, avg, max) = (186.963, 195.331, 199.312), stdev = 3.456
CI (99.9%): [191.637, 199.026] (assumes normal distribution)
关于cassandra - Redis AOF fsync(始终)与 LSM 树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50478674/
我通过 C API 使用 RocksDB。 我有一个测试程序,它打开数据库,执行 1,000 次写入(收集启动写入和回调之间的计时数据),执行 1,000 次读取,然后关闭。 这有效。平均写入时间约为
我想问一个基本的问题,即使用fsync之类的系统调用何时有用?我是初学者,我总是给人以写足以写入文件的印象,而使用write的示例实际上在末尾写入了文件。 那么像fsync这样的系统调用的目的是什么?
我对大文件 ftruncate 和 fsync 操作感到惊讶。我编写了一个程序,在 Linux 64 位系统上创建一个空文件,将其截断为 0xffffffff 字节,然后 fsync 它。 在所有操作
我有两个 (POSIX) 线程写入这样的日志文件: pthread_mutex_lock(&log_mutex); fprintf(LOG, "something...\n"); fsync(file
我正在尝试fsync目录,以确保重命名操作发生。我遇到的问题是 Python 不断返回权限错误,即使我对我尝试过的各个文件夹拥有完全权限。 directory = r'C:\Random\Path'
我正在尝试创建一个文件。在这个文件中,我将所有需要处理的文件放在一个脚本中,并将该文件作为参数传递。我的问题是有时列表的长度不足以填满缓冲区,并且没有任何内容写入磁盘。我尝试刷新和 fsync 临时文
假设我将一些文件和目录写入 USB 拇指驱动器。 /media/drive1/newFolder1/ /media/drive1/newFolder1/newfile1 /media/drive1/n
我很难确定将 fsync() 实现到实时系统中的最佳方法是什么。我需要满足的唯一要求是 fsync() 不能中断帧(每帧 100 Hz - 10 ms)。我做了一些初始基准测试,目前我倾向于在每次固定
我们需要一个应用程序尽可能地保证当它报告记录时确实存在。我知道要执行此操作,您需要使用 fsync(fd)。然而,由于某些奇怪的原因,使用 fsync() 似乎加快了写入磁盘的代码,而不是像人们预期的
我有多个线程,每个线程都接受请求,进行一些处理,将结果存储在提交日志中,然后返回结果。为了保证最多 x 秒的数据丢失,这个提交日志需要每 x 秒 fsync 一次。 我想避免线程之间的同步,这意味着他
是否有类似于fsync但使用文件路径而不是文件描述符的linux系统调用?我使用utime修改文件修改时间,文件在U盘中,我需要确保设置utime后时间刷入usb。 最佳答案 据我所知没有。 为此你需
fsync 的联机帮助页说: If the underlying hard disk has write caching enabled, then the data may not really b
假设您正在构建一个日记/预写日志存储系统。您能否通过(针对每个事务)附加数据(使用 write(2))、附加提交标记,然后 fsync-ing 来简单地实现这一点? 要考虑的场景是,如果您对该日志进行
我使用以下函数将一些数据写入文件: def WriteTo1File(self, output_file, text): output_file.write(text) output_
我有一个禁用了写入缓存的 SATA 硬盘: hdparm -W0 /dev/foo 我在一个 ext4 分区上使用这些挂载选项(以及其他): data=ordered auto_da_alloc Li
我知道当我使用 write() 写文件时+ fsync() (或 O_SYNC + write() ,我认为它们是相同的 ref #1 ref #2 ),这意味着我正在使用阻塞同步 I/O,如果 wr
执行以下代码时出现错误,请您帮我解决此错误 public fun getEntityManager(): EntityManager { val tm: TransactionManager
我正在使用 C# 开发一个与数据库相关的项目。每次提交事务后,我希望数据库将所有缓冲数据移动到磁盘上。在 Linux 中,fflush() + fsync() 会提供我想要的。要达到同样的效果,我应该
Boost library提供类似于 fsync() 的内容? 动机:超越 POSIX 的可移植性 - 例如以便在 Windows 上使用类似的功能。 最佳答案 不,boost 没有这样的东西。正如
目录上的 fsync() 是否保证目录和所有子目录也被刷新? 假设我有 foo |- bar |- baz | |--file 如果我写'file'然后在foo上进行fsyn
我是一名优秀的程序员,十分优秀!