单机下如何让Java程序支持百万长连接,你知道吗?

如果系统回显类似于"Operation not permitted"之类的话,说明上述限制修改失败,实际上是因为在中指定的数值超过了Linux系统对该用户打开文件数的软限制或硬限制。因此,就还需要修改Linux系统对用户的关于打开文件数的软限制和硬限制。

软限制(soft limit:是指Linux在当前系统能够承受的范围内进一步限制用户同时打开的文件数;

*硬限制(hardlimit)**😗是根据系统硬件资源状况(主要是系统内存)计算出来的系统最多可同时打开的文件数量。

第一步,修改/etc/security/limits.conf文件,在文件中添加如下行:

  • soft nofile 1000000

  • hard nofile 1000000

'*'号表示修改所有用户的限制;

soft或hard指定要修改软限制还是硬限制;1000000则指定了想要修改的新的限制值,即最大打开文件数(请注意软限制值要小于或等于硬限制)。修改完后保存文件。

第二步,修改/etc/pam.d/login文件,在文件中添加如下行:

session required /lib/security/pam_limits.so

这是告诉Linux在用户完成系统登录后,应该调用pam_limits.so模块来设置系统对该用户可使用的各种资源数量的最大限制(包括用户可打开的最大文件数限制),而pam_limits.so模块就会从/etc/security/limits.conf文件中读取配置来设置这些限制值。修改完后保存此文件。

第三步,查看Linux系统级的最大打开文件数限制,使用如下命令:

cat /proc/sys/fs/file-max

12158

这表明这台Linux系统最多允许同时打开(即包含所有用户打开文件数总和)12158个文件,是Linux系统级硬限制,所有用户级的打开文件数限制都不应超过这个数值。通常这个系统级硬限制是Linux系统在启动时根据系统硬件资源状况计算出来的最佳的最大同时打开文件数限制,如果没有特殊需要,不应该修改此限制,除非想为用户级打开文件数限制设置超过此限制的值。

如何修改这个系统最大文件描述符的限制呢?修改sysctl.conf文件

vi /etc/sysctl.conf

# 在末尾添加

fs.file_max = 1000000

# 立即生效

sysctl -p

JVM层面相关性能优化

当客户端的并发连接数达到数十万或者数百万时,系统一个较小的抖动就会导致很严重的后果,例如服务端的GC导致应用暂停。GC持续几秒,就会导致海量的客户端设备掉线或者消息积压,一旦系统恢复,会有海量的设备接入或者海量的数据发送很可能瞬间就把服务端冲垮。

JVM层面的调优主要涉及GC参数优化,GC参数设置不当会导致频繁GC,甚至OOM异常,对服务端的稳定运行产生重大影响。

1.确定GC优化目标

GC(垃圾收集)有三个主要指标。

(1)吞吐量:是评价GC能力的重要指标,在不考虑GC引起的停顿时间或内存消耗时,吞吐量是GC能支撑应用程序达到的最高性能指标。

(2)延迟:GC能力的最重要指标之一,是由于GC引起的停顿时间,优化目标是缩短延迟时间或完全消除停顿(STW),避免应用程序在运行过程中发生抖动。

(3)内存占用:GC正常时占用的内存量。

JVM GC调优的三个基本原则如下。

(1) Minor go回收原则:每次新生代GC回收尽可能多的内存,减少应用程序发生Full GC的频率。

2)GC内存最大化原则:垃圾收集器能够使用的内存越大,垃圾收集效率越高,应用程序运行也越流畅。但是过大的内存一次 Full GC耗时可能较长,如果能够有效避免FullGC,就需要做精细化调优。

(3)3选2原则:吞吐量、延迟和内存占用不能兼得,无法同时做到吞吐量和暂停时间都最优,需要根据业务场景做选择。对于大多数应用,吞吐量优先,其次是延迟。当然对于时延敏感型的业务,需要调整次序。

2.确定服务端内存占用

总结

阿里伤透我心,疯狂复习刷题,终于喜提offer 哈哈~好啦,不闲扯了

image

1、JAVA面试核心知识整理(PDF):包含JVMJAVA集合JAVA多线程并发,JAVA基础,Spring原理微服务,Netty与RPC,网络,日志,ZookeeperKafkaRabbitMQ,Hbase,MongoDB,Cassandra,设计模式负载均衡数据库一致性哈希JAVA算法数据结构,加密算法,分布式缓存,Hadoop,Spark,Storm,YARN,机器学习,云计算共30个章节。

image

2、Redis学习笔记及学习思维脑图

image

3、数据面试必备20题+数据库性能优化的21个最佳实践

image
1880498890)]

3、数据面试必备20题+数据库性能优化的21个最佳实践

[外链图片转存中…(img-XwN2iwRs-1721880498891)]

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 连接 MongoDB 的方式有多种,包括单机连接和集群连接。下面介绍一下集群连接的方式。 1. 使用 MongoDB 官方提供的 Java 驱动程序 MongoDB 官方提供的 Java 驱动程序可以通过 Maven 坐标获取: ```xml <dependency> <groupId>org.mongodb</groupId> <artifactId>mongo-java-driver</artifactId> <version>3.12.4</version> </dependency> ``` 连接代码示例: ```java // 配置 MongoDB 集群地址 List<ServerAddress> seeds = Arrays.asList( new ServerAddress("node1:27017"), new ServerAddress("node2:27017"), new ServerAddress("node3:27017") ); // 连接 MongoDB 集群 MongoClient mongoClient = new MongoClient(seeds); // 获取数据库实例 MongoDatabase db = mongoClient.getDatabase("test"); ``` 2. 使用 Spring Data MongoDB Spring Data MongoDB 是 Spring 框架的一个子项目,提供了更为简便的操作 MongoDB 的方式。 在 Maven 中引入 Spring Data MongoDB 的依赖: ```xml <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-mongodb</artifactId> <version>2.2.5.RELEASE</version> </dependency> ``` 连接代码示例: ```java // 配置 MongoDB 集群地址 List<String> hosts = Arrays.asList( "node1:27017", "node2:27017", "node3:27017" ); // 创建 MongoClientOptions 对象 MongoClientOptions options = MongoClientOptions.builder() .connectTimeout(5000) .build(); // 配置 MongoDB 客户端连接工厂 MongoClientFactoryBean factory = new MongoClientFactoryBean(); factory.setReplicaSetSeeds(hosts); factory.setMongoClientOptions(options); // 获取 MongoClient 对象 MongoClient mongoClient = factory.getObject(); // 获取 MongoTemplate 实例 MongoTemplate mongoTemplate = new MongoTemplate(mongoClient, "test"); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值