我们正在使用Apache Cassandra 3.0.7版本,并且我们看到90%的内存几乎占用所有节点,即使很少使用磁盘。我们有一个5个节点的集群,15 GB内存,4个内核,每个200 GB SSD。
我们通过YAML和表级属性尝试了所有类型的配置,但似乎没有任何帮助。内存使用量不断增加几乎与数据成正比。
考虑到我们的应用程序是一个写密集型应用程序,我们可以降低读取性能,但希望尽可能少地利用内存。为此,我们的想法是禁用所有可能的缓存或避免在内存中保留任何不必要的内容。但到目前为止似乎没有任何帮助。
这是我们的yaml:http://pastebin.com/yeRGcHRt
以及我们的表格配置:
如果不存在则创建KEYSPACE test_ks WITH replication = {' class': ' SimpleStrategy',' replication_factor':' 1'};如果没有,则创建表 存在test_ks.test_cf(id bigint PRIMARY KEY,key_str text,value1 int,value2 int,update_ts bigint)WITH bloom_filter_fp_chance = 1 AND 评论='' AND compaction = {' class': ' org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy&#39 ;, ' max_threshold':' 32',' min_threshold':' 4'}和压缩= {' chunk_length_in_kb':' 64',' class': ' org.apache.cassandra.io.compress.LZ4Compressor'}和crc_check_chance = 1.0 AND dclocal_read_repair_chance = 0.1 AND default_time_to_live = 0 AND gc_grace_seconds = 864000 AND max_index_interval = 10240 AND memtable_flush_period_in_ms = 3600000 AND min_index_interval = 10240 AND read_repair_chance = 0.0 AND speculative_retry =' 99PERCENTILE' AND caching = {' keys':' NONE',' rows_per_partition':' NONE'};
我们已经看到大部分消耗都在堆外,堆内存的上限为4.5 G.因此,在节点上总共14 G,堆只消耗4.5G。
之前有没有人试过这样的配置?如果在这种情况下禁用缓存可以帮助我们,请告诉我们。如果是,我们如何完全禁用缓存。期待您的帮助。
答案 0 :(得分:0)
要减少已用内存,请尝试设置下一个参数
MAX_HEAP_SIZE, HEAP_NEWSIZE
在cassandra-env.sh中你想要的值
答案 1 :(得分:0)
我们遇到了类似的问题。从Cassandra 2.x升级到3.11.0之后,Cassandra在堆上使用< 2GB并且在堆上使用了> 10GB,这个用例以前没有任何问题。这导致(Windows)机器持续保持99.5%的内存使用率。堆内存的上限同样为2GB。
大多数缓存值都保留为默认值;特别是行缓存被禁用。
编辑:我有更好的答案。看来(仍在测试)我们案例的缓慢是因为Windows'页面文件未被禁用。卡桑德拉recommends disabling the swap file on Linux或page file on Windows。如果检测到交换或页面文件,它也是outputs a warning on startup。Cassandra的堆外内存,至少在Windows上,主要是由于文件的内存映射IO,显然(从阅读Cassandra问题跟踪器)显着更快。但是,如果启用了交换/页面文件,则mmapped文件会强制将物理内存排除在物理内存之外,并且会遇到大量减速交换到磁盘。在我们的测试中禁用Windows上的页面文件似乎可以显着减轻这种影响。 Cassandra仍然为mmapped文件使用大量内存,但由于没有内存被交换到磁盘,Cassandra和OS的某些组合正确地释放了mmapped文件,以便其他进程可以顺利运行。我使用this tool确认Windows上存在mmapped文件。
答案 2 :(得分:0)
尝试set -XX:MaxDirectMemorySize
。它将限制使用堆外内存