性能优化 #

一、性能优化概述 #

1.1 优化方向 #

text
性能优化方向:

数据模型
├── 主键设计
├── 分区大小
└── 反范式化

读写优化
├── 一致性级别
├── 批量操作
└── 并发控制

配置调优
├── 内存配置
├── 并发配置
└── 压缩策略

硬件优化
├── 磁盘IO
├── 网络带宽
└── CPU资源

1.2 性能指标 #

text
关键性能指标:

延迟
├── 读延迟:< 10ms
├── 写延迟:< 5ms
└── P99延迟:监控

吞吐量
├── 读TPS:根据业务
├── 写TPS:根据业务
└── 并发连接数

资源使用
├── CPU使用率:< 70%
├── 内存使用率:< 80%
├── 磁盘IO:< 80%
└── 网络带宽:< 70%

二、数据模型优化 #

2.1 主键设计 #

sql
-- 好的设计:分区均匀
CREATE TABLE events (
    device_id TEXT,
    date DATE,
    hour INT,
    event_time TIMESTAMP,
    data TEXT,
    PRIMARY KEY ((device_id, date, hour), event_time)
);

-- 不好的设计:分区过大
CREATE TABLE events_bad (
    device_id TEXT,
    event_time TIMESTAMP,
    data TEXT,
    PRIMARY KEY (device_id, event_time)
);

2.2 分区大小控制 #

text
分区大小建议:

推荐
├── < 100MB
├── 查询效率高
└── 修复速度快

警告
├── > 100MB
├── 性能下降
└── 监控关注

限制
├── > 2GB
├── 严重性能问题
└── 需要重新设计

2.3 反范式化 #

sql
-- 反范式化:为查询创建多个表
CREATE TABLE orders_by_user (
    user_id UUID,
    order_id UUID,
    order_date DATE,
    amount DECIMAL,
    PRIMARY KEY (user_id, order_id)
);

CREATE TABLE orders_by_date (
    order_date DATE,
    order_id UUID,
    user_id UUID,
    amount DECIMAL,
    PRIMARY KEY (order_date, order_id)
);

三、读写优化 #

3.1 一致性级别选择 #

sql
-- 高性能:ONE
CONSISTENCY ONE;
INSERT INTO users ...

-- 平衡性能和一致性:QUORUM
CONSISTENCY QUORUM;
SELECT * FROM orders ...

-- 本地优先:LOCAL_QUORUM
CONSISTENCY LOCAL_QUORUM;
SELECT * FROM users ...

3.2 批量操作 #

sql
-- 同分区批量操作
BEGIN UNLOGGED BATCH
    INSERT INTO orders (user_id, order_id, amount)
    VALUES (?, ?, ?);
    INSERT INTO orders (user_id, order_id, amount)
    VALUES (?, ?, ?);
APPLY BATCH;

3.3 分页查询 #

sql
-- 使用分页避免大结果集
SELECT * FROM orders 
WHERE user_id = ?
LIMIT 100;

-- 使用fetch_size
-- 驱动配置

四、内存优化 #

4.1 JVM堆内存 #

bash
# jvm.options

# 堆内存(建议不超过32GB)
-Xms16G
-Xmx16G

# 年轻代(堆的1/4)
-Xmn4G

# 避免压缩指针问题
# 如果堆 > 32GB,使用 -XX:+UseCompressedOops

4.2 缓存配置 #

yaml
# cassandra.yaml

# 键缓存
key_cache_size_in_mb: 100

# 行缓存(谨慎使用)
row_cache_size_in_mb: 0

# 缓存提供者
row_cache_provider: SerializingCacheProvider

4.3 MemTable配置 #

yaml
# cassandra.yaml

# MemTable堆内存比例
memtable_heap_space_in_mb: 2048

# MemTable非堆内存
memtable_offheap_space_in_mb: 2048

# 刷新阈值
memtable_flush_writers: 8

五、压缩优化 #

5.1 压缩策略选择 #

sql
-- SizeTieredCompactionStrategy(默认)
-- 适合:写入密集
CREATE TABLE write_heavy (
    id UUID PRIMARY KEY,
    data TEXT
) WITH compaction = {
    'class': 'SizeTieredCompactionStrategy',
    'min_threshold': 4,
    'max_threshold': 32
};

-- LeveledCompactionStrategy
-- 适合:读取密集
CREATE TABLE read_heavy (
    id UUID PRIMARY KEY,
    data TEXT
) WITH compaction = {
    'class': 'LeveledCompactionStrategy',
    'sstable_size_in_mb': 160
};

-- TimeWindowCompactionStrategy
-- 适合:时间序列
CREATE TABLE time_series (
    id UUID,
    event_time TIMESTAMP,
    data TEXT,
    PRIMARY KEY (id, event_time)
) WITH compaction = {
    'class': 'TimeWindowCompactionStrategy',
    'compaction_window_unit': 'HOURS',
    'compaction_window_size': 1
};

5.2 压缩配置 #

yaml
# cassandra.yaml

# 压缩吞吐量(MB/s)
compaction_throughput_mb_per_sec: 64

# 并发压缩
concurrent_compactors: 4

# 墓碑压缩阈值
tombstone_threshold: 0.2
tombstone_compaction_interval: 86400

六、IO优化 #

6.1 磁盘配置 #

yaml
# cassandra.yaml

# 数据目录(多磁盘)
data_file_directories:
  - /data1/cassandra/data
  - /data2/cassandra/data
  - /data3/cassandra/data

# 提交日志(独立磁盘)
commitlog_directory: /commitlog/cassandra/commitlog

# 提交日志同步
commitlog_sync: periodic
commitlog_sync_period_in_ms: 10000

6.2 并发配置 #

yaml
# cassandra.yaml

# 并发读写
concurrent_reads: 32
concurrent_writes: 32
concurrent_counter_writes: 32

# 网络线程
native_transport_max_threads: 128

# 请求超时
read_request_timeout_in_ms: 5000
write_request_timeout_in_ms: 2000

七、监控与诊断 #

7.1 性能监控 #

bash
# 查看延迟
nodetool tablestats | grep -i latency

# 查看压缩
nodetool compactionstats

# 查看线程池
nodetool tpstats

# 查看缓存命中率
nodetool info | grep -i cache

7.2 性能诊断 #

sql
-- 启用查询追踪
TRACING ON;
SELECT * FROM users WHERE user_id = ?;

-- 查看执行计划

7.3 性能问题排查 #

text
常见性能问题:

读延迟高
├── 检查分区大小
├── 检查缓存命中率
├── 检查压缩状态
└── 检查墓碑数量

写延迟高
├── 检查MemTable刷新
├── 检查压缩队列
├── 检查磁盘IO
└── 检查并发配置

GC频繁
├── 检查堆内存大小
├── 检查对象创建
├── 调整GC参数
└── 检查内存泄漏

八、总结 #

性能优化要点:

  1. 数据模型:合理设计主键,控制分区大小
  2. 一致性级别:根据需求选择合适的级别
  3. 内存配置:合理配置堆内存和缓存
  4. 压缩策略:根据场景选择合适策略
  5. IO优化:多磁盘、独立提交日志
  6. 监控诊断:持续监控,及时发现问题

下一步,让我们学习监控与诊断!

最后更新:2026-03-27