我们正在尝试为Cassandra Datastax社区版和java驱动程序创建原型 . 我尝试使用Cassandra Java Driver(simplex密钥空间)中的Sample测量简单检索和更新的延迟 .
我有两个数据中心,每个数据中心有一个Rack . 每个机架包含3个节点 . 我总共有6个节点(VM) .
我已将key_cache_size_in_mb配置为10,以便调整检索/更新操作 .
总之,我们正在尝试调整示例操作,以便为读取/更新操作获得大约5 ms的延迟 .
遵循我们设法实现的延迟:
检索播放列表表已过去19毫秒 .
Headers 专辑艺术家
特纳表演Mick Jager的备忘录
更新simplex.playlist已经过了14毫秒来更新歌曲表 .
检索歌曲表已过去14毫秒 .
Headers 专辑艺术家标签
La Petite Tonkinoise' Bye Bye Blackbird'JosšphineBaker
为了提高性能并实现比上述更好的延迟,应该进行哪些调整?
您的方向/洞察力将受到高度赞赏 .
提前谢谢,欧文
1 回答
一些性能优化提示/最佳实践:
节点数量越多,分布越好,C *表现越好
64位JVM的性能优于32位(至少使用Oracle JVM 1.6)
物理环境,最小为8GB,但16-32 GB,8核处理器之间的任何东西
at least two disks, one for the commit log and the other for the data directories
Commit Log + data directory on same volumes – avoid this. 写入的最大性能增益是将提交日志放在单独的磁盘驱动器中 . 提交日志是100%顺序的,而数据读取是从数据目录中随机的 . 提交日志和SSTable之间的I / O争用可能会恶化提交日志写入和SSTable读取 . 但这不适用于SSD或EC2 .
JVM参数调整(在8GB RAM系统上)
Heap tuning
-Xms $ -Xmx $ - 默认为可用物理内存的40-50% - 4 GB -Xmn $ - 默认为java堆的25% - 1GB
GC tuning
-XX:UseConcMarkSweepGC -XX:CMSParallelRemarkEnabled -XX:UseParallelGC -XX:SurvivorRatio = 4 -XX:MaxTenuringThreshold = 0
Synch the clocks on all nodes - 当C *为每个coumn值添加时间戳时,必须使用NTP守护程序或脚本在环上同步时钟 . 已知NTP可以跨数据中心漂移时钟 .
Use Key cache sparingly ,因为它只存储密钥和数据位置,因此在内存占用最少的情况下具有最高的性能提升 . 保存一个文件I / O搜索 . 使用keys_cached = 50000更新列族my_column_family;
使用RF = 3,这是最佳做法,写/读一致性等级= QUORUM是最佳做法
在Linux上,您可以找到cassandra.sh,它用于启动Cassandra进程 . 这是我们添加GC参数以及JVM内存设置的地方 . (首先备份文件)我假设你有4GB分配给cassandra进程 . 假设您有8GB系统内存,请为Cassandra进程分配-Xmx4096m .
https://github.com/apache/cassandra/blob/trunk/conf/cassandra-env.sh?source=cc
您可以调整“#GC调整选项”部分中编码的选项
key_cache_size_in_mb - 此设置可以在cassandra.yaml文件中找到,并且适用于密钥空间中的所有列系列,或者设置为CF级别 . 您需要知道行的大小,并计算出计算结果 . 例如对于要缓存的100万行,平均行大小为100字节,每列有25个列,每个4字节,需要将其设置为100 mb(1 mn * 100 bytes)