Java程序员也应该知道的系统知识系列之网卡

简介:

作者:林昊

wangka

对于编写分布式Java应用的同学而言,网卡的一些知识也是必须掌握的,例如什么是网卡的bonding模式,网卡的中断处理,os相关的参数等。

 

机器上网卡的型号可通过lspci | grep -i ether来查看,同样在看到网卡的型号后可通过google了解下网卡的状况,对于Java应用而言,主要需要关注的是网卡是否支持多队列,这个可以通过lspci -vvv | grep -i msi-x来查看网卡是否支持多队列,以及支持多少个队列,具体多队列的作用后面讲。

机器上网卡的bonding模式是需要了解的,原因是bonding模式对应用可用的网络带宽会有直接影响,网卡的bonding模式可通过cat /proc/net/bonding/*bond*来查看,看到的信息会类似如下:
Bonding Mode: fault-tolerance (active-backup)
上面这种模式代表一块网卡是激活的,另一块是备份状态,也就是应用能用的网络带宽是一块网卡,例如网卡是千兆的,那意味着应用最多能用的网络带宽是1000m bits(这个还取决于机器所在的网络环境的收敛比),linux支持7种网卡的bonding模式,感兴趣的话可以google看下。

除了bonding模式外,和应用比较相关的另外一点就是网卡的中断处理,这个在之前有专门写过一篇文章,具体请见前面的文章。

除了硬件层面外,os层面有几个和网络相关的重要参数:
net.core.somaxconn
net.ipv4.tcp_max_syn_backlog
这两个参数是用来控制并发建连接时等待的队列长度,当队列满了后,后续连接会直接失败,对于需要支撑较大量的并发连接的server端而言就很重要了,但对于java程序而言,如果是直接new ServerSocket这种的,会把backlog这个值设置为50,因此最好是在写程序的时候能设置下这个值,无论是直接基于java写,还是基于一些通讯框架写,backlog这个都是支持设置的,具体也可以看看这个关于backlog的case

由于每建一个连接其实都是打开一个文件,因此需要关注下进程的open files的限制,可通过cat /proc/[pid]/limits来查看其中的Max open files,这个值建议稍微配大一些(否则很容易出现too many open files的错误),可通过修改/etc/security/limits.conf或直接ulimit -n来设置。

net.ipv4.tcp_tw_reuse
net.ipv4.tcp_tw_recycle
net.ipv4.tcp_tw_timeout
这三个参数主要是用来控制time_out连接的回收的,如果不配置好可能会出现time_wait太多导致连接建不了的现象,其中tcp_tw_recycle最好关闭,在通过lb设备连接的情况下,如果打开这个参数,有些时候会出问题。

net.ipv4.tcp_wmem
net.ipv4.tcp_rmem
读写缓冲区,这个值如果太小,会导致在读写的时候出现网卡阻塞的现象,例如写就会出现写不进网卡的现象,而由于linux默认的值通常太小,尤其是在局域网环境下,由于网络的不可确定性,Java通信程序在编写的时候一定要注意限流,避免由于send buffer满的情况下java heap也被耗光的现象(由于sendbuffer被写满,通常发不出去的数据就会缓存在java heap里)。

 

网卡的资源使用率状况可以通过sar -n DEV来查看,需要关注的重点还是网络带宽,另外要关注的一点是cpu上处理网卡中断的均衡性状况,这个通过观看cpu的hi/si指标可以看出。

对于编写通信框架或RPC框架的同学而言,小包跑满网卡带宽通

常是目标(因为大包的话很容易就跑满了),但要做到难度还是不小的,具体可见我做的一个开源rpc框架nfs-rpc的优化记录(ps: 欢迎大家来一起做优化)。

 

在网卡带宽跑满的情况下,通常可选择优化方法是压缩,压缩通常可选择的是java自带的zip、lzo以及google的snappy,相比而言其实基本就是在lzo和snappy中做选择就可,在优化了的情况下网络带宽仍跑满而其他资源比较富余的话,可以考虑网卡多块激活,或升级到更高带宽的网卡,例如千兆到万兆等,但这些优化就不仅仅是单机了,而是要整个结构配合。

相关文章
|
2月前
|
Java 程序员
JAVA程序员的进阶之路:掌握URL与URLConnection,轻松玩转网络资源!
在Java编程中,网络资源的获取与处理至关重要。本文介绍了如何使用URL与URLConnection高效、准确地获取网络资源。首先,通过`java.net.URL`类定位网络资源;其次,利用`URLConnection`类实现资源的读取与写入。文章还提供了最佳实践,包括异常处理、连接池、超时设置和请求头与响应头的合理配置,帮助Java程序员提升技能,应对复杂网络编程场景。
75 9
|
2月前
|
监控 Java API
如何使用Java语言快速开发一套智慧工地系统
使用Java开发智慧工地系统,采用Spring Cloud微服务架构和前后端分离设计,结合MySQL、MongoDB数据库及RESTful API,集成人脸识别、视频监控、设备与环境监测等功能模块,运用Spark/Flink处理大数据,ECharts/AntV G2实现数据可视化,确保系统安全与性能,采用敏捷开发模式,提供详尽文档与用户培训,支持云部署与容器化管理,快速构建高效、灵活的智慧工地解决方案。
|
2月前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
2月前
|
SQL 存储 Java
面向 Java 程序员的 SQLite 替代品
SQLite 是轻量级数据库,适用于小微型应用,但其对外部数据源支持较弱、无存储过程等问题影响了开发效率。esProc SPL 是一个纯 Java 开发的免费开源工具,支持标准 JDBC 接口,提供丰富的数据源访问、强大的流程控制和高效的数据处理能力,尤其适合 Java 和安卓开发。SPL 代码简洁易懂,支持热切换,可大幅提高开发效率。
|
2月前
|
运维 自然语言处理 供应链
Java云HIS医院管理系统源码 病案管理、医保业务、门诊、住院、电子病历编辑器
通过门诊的申请,或者直接住院登记,通过”护士工作站“分配患者,完成后,进入医生患者列表,医生对应开具”长期医嘱“和”临时医嘱“,并在电子病历中,记录病情。病人出院时,停止长期医嘱,开具出院医嘱。进入出院审核,审核医嘱与住院通过后,病人结清缴费,完成出院。
126 4
|
2月前
|
SQL Java 程序员
倍增 Java 程序员的开发效率
应用计算困境:Java 作为主流开发语言,在数据处理方面存在复杂度高的问题,而 SQL 虽然简洁但受限于数据库架构。SPL(Structured Process Language)是一种纯 Java 开发的数据处理语言,结合了 Java 的架构灵活性和 SQL 的简洁性。SPL 提供简洁的语法、完善的计算能力、高效的 IDE、大数据支持、与 Java 应用无缝集成以及开放性和热切换特性,能够大幅提升开发效率和性能。
|
2月前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
51 1
|
3月前
|
IDE Java 程序员
C++ 程序员的 Java 指南
一个 C++ 程序员自己总结的 Java 学习中应该注意的点。
27 5
|
2月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
3月前
|
移动开发 前端开发 JavaScript
java家政系统成品源码的关键特点和技术应用
家政系统成品源码是已开发完成的家政服务管理软件,支持用户注册、登录、管理个人资料,家政人员信息管理,服务项目分类,订单与预约管理,支付集成,评价与反馈,地图定位等功能。适用于各种规模的家政服务公司,采用uniapp、SpringBoot、MySQL等技术栈,确保高效管理和优质用户体验。
下一篇
开通oss服务