cassandra节点down机(java.lang.OutOfMemoryError: unable to create new native thread)

本文针对在CentOS 6 64位系统上进行压力测试时遇到的Cassandra节点宕机问题进行了详细分析。问题根源在于Linux系统的maxuserprocesses(nproc)限制导致内存溢出。文中提供了具体的错误信息,并给出了临时解决方案和永久修复方法,包括调整当前会话的nproc限制和修改全局配置文件。
在对集群做压力测试的时候,发现有节点down机,错误信息如下。google后查明原因,由于Linux " max user processes(nproc)"所致,我操作系统的是 CentOS 6 64bit,修改方法如下:
错误信息
ERROR [Thread-28] 2013-07-25 06:14:05,055 CassandraDaemon.java (line 175) Exception in thread Thread[Thread-28,5,main]
java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:640)
at java.util.concurrent.ThreadPoolExecutor.addThread(ThreadPoolExecutor.java:681)
at java.util.concurrent.ThreadPoolExecutor.addIfUnderMaximumPoolSize(ThreadPoolExecutor.java:727)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:655)
at org.apache.cassandra.thrift.CustomTThreadPoolServer.serve(CustomTThreadPoolServer.java:113)
at org.apache.cassandra.thrift.ThriftServer$ThriftServerThread.run(ThriftServer.java:111)

 

当前会话有效设置
ulimit -u # 查看nproc
ulimit -u 65535 # 设置nproc,仅当前会话有效

  

全局有效
cat /etc/security/limits.d/90-nproc.conf
* soft nproc 1024

vi /etc/security/limits.d/90-nproc.conf
* soft nproc 65535

 

参考:

java.lang.OutOfMemoryError: unable to create new native thread

关于RHEL6中ulimit的nproc限制

ulimit限制之nproc问题

 

  --end

 

 

 

这个错误信息: ``` Error creating bean with name 'userCasRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract java.util.List org.springframework.data.cassandra.repository.CassandraRepository.insert(java.lang.Iterable)! No property insert found for type User! ``` 表明你在使用 `Spring Data Cassandra` 的时候,**自定义的 Repository 接口**继承了 `CassandraRepository`,并且你可能尝试调用了 `insert(Iterable<User>)` 方法,但 Spring Data Cassandra 在解析这个方法时,**发现你的实体类 `User` 缺少某个属性**,或者 **方法名使用不当**,从而导致查询构建失败。 --- ### 🔍 错误原因分析: 1. **方法名冲突或不支持** `insert(Iterable<User>)` 并不是 Spring Data Cassandra 的标准方法,`CassandraRepository` 中并没有这个方法。 2. **误用 JPA 方法名风格** Spring Data JPA 中有 `saveAll()` 方法,但在 Cassandra 中你需要使用 `CassandraTemplate` 或者 `ReactiveCassandraTemplate` 来处理批量操作。 3. **实体类字段不匹配** 如果你的 `User` 实体类中没有正确使用 `@PrimaryKey`、`@Column` 等注解,也可能导致解析失败。 --- ### ✅ 解决方案 #### ✅ 方法一:使用 `CassandraTemplate` 替代 Repository 的批量插入 ```java @Service public class UserService { @Autowired private CassandraTemplate cassandraTemplate; public void batchInsertUsers(List<User> users) { cassandraTemplate.insert(users); } } ``` #### ✅ 方法二:确保你的 Repository 接口使用正确方法 ```java public interface UserCasRepository extends CassandraRepository<User, String> { // 只保留支持的方法,不要使用 insert(Iterable) } ``` 并使用 `CassandraTemplate` 处理批量操作。 #### ✅ 方法三:检查你的实体类是否正确定义 ```java @Table("user") public class User { @PrimaryKey("id") private String id; @Column("name") private String name; @Column("email") private String email; // getters and setters } ``` 确保: - 使用了 `@Table` 注解指定表名; - 主键字段使用 `@PrimaryKey`; - 其他字段使用 `@Column` 明确列名。 --- ### ✅ 推荐做法:统一使用 CassandraTemplate 处理复杂操作 由于 Spring Data Cassandra 功能有限,建议: - 简单的 CRUD 使用 `CassandraRepository`; - 批量操作、自定义查询等使用 `CassandraTemplate` 或自定义 DAO。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值