首页/新闻资讯/正文详情

VJTools 容器化实践:用 libsysconfcpus 让 JVM 获取真实 CPU 核数

发布时间:2026/9/28 2:55:21 来源:云帆数科 栏目:资讯中心
VJTools 容器化实践:用 libsysconfcpus 让 JVM 获取真实 CPU 核数
开发工具可观测性后端【免费下载链接】vjtoolsThe vip.coms java coding standard, libraries and tools项目地址https://gitcode.com/gh_mirrors/vj/vjtools点击查看免费下载容器中的 JVM 默认通过sysconf(_SC_NPROCESSORS_CONF)读取宿主机的 CPU 核数导致 GC 线程数、Netty 线程数等按宿主机规模配置造成线程泛滥与资源争抢。本文以唯品会开源项目 vjtools 中vjstar模块的 docker-cpus 方案 为核心讲解基于 libsysconfcpus 的通用补丁原理、镜像编译步骤与启动脚本改造方法并给出-server模式下的 2 核下限等关键注意事项帮助你在任何 JDK 版本上为容器 JVM 注入真实 CPU 配额。问题背景容器里 JVM 看到的核数为什么是假的Docker 容器通过--cpus或cpuset限制进程可用的 CPU但 JVM 在启动时并不读取容器的 cgroup 配额而是直接调用操作系统接口sysconf(_SC_NPROCESSORS_CONF)获取系统配置的处理器数量。在宿主机上部署多个容器时这个返回值是宿主机的总核数而非容器被分配到的核数。这个误差会沿 JVM 的运行时参数一路放大GC 线程数Parallel GC / CMS 默认按CPU核数 * 5/8计算并行线程数多余线程造成无谓的上下文切换Netty 等框架的默认线程数如 Netty 的 EventLoop 默认按2 * CPU核数创建线程数虚高直接拉高内存占用ForkJoinPool 公共池、定时线程池等均以Runtime.availableProcessors()为基准同样失真。官方修复并不覆盖所有版本。vjstar模块在 vjstar/README.md 中明确指出据说 JDK8 的最新版解决了这个问题但其他版本的 JDK 则建议使用此补丁。 因此唯品会vip.com在生产上采用基于 libsysconfcpus 的方案为各个版本的 JDK 提供一个通用解决方案。补丁原理LD_PRELOAD 截获 sysconf 系统调用libsysconfcpus.so 的原理非常精巧它利用 Linux 动态链接器的LD_PRELOAD机制抢先加载一个同名的sysconf函数实现从而截获 JVM 获取 CPU 核数所用的系统调用sysconf(_SC_NPROCESSORS_CONF)将其返回值改为读取环境变量LIBSYSCONFCPUS。整体调用链如下JVM 启动 └─ Runtime.availableProcessors() └─ sysconf(_SC_NPROCESSORS_CONF) ← 被 LD_PRELOAD 的 libsysconfcpus.so 截获 └─ 返回环境变量 LIBSYSCONFCPUS 的值而非宿主机核数只要在 JVM 进程启动前设置好两个环境变量整个过程对应用代码完全透明LIBSYSCONFCPUS告诉截获层容器实际分到了几个核LD_PRELOAD指向编译好的libsysconfcpus.so且必须放在最前面保证它优先于其他库被加载。第一步编译 libsysconfcpus.so 并放入镜像从 libsysconfcpus 项目获取源码并编译出共享库这一步通常在构建镜像时完成git clone libsysconfcpus 项目地址 cd libsysconfcpus make # 产物为 libsysconfcpus.so将编译产物安装到镜像的标准路径例如/usr/local/lib/libsysconfcpus.so。后续脚本中的LD_PRELOAD路径需与此保持一致。若你的基础镜像缺少编译工具链应尽量在构建阶段编译完成后再将 so 文件单独拷贝进运行镜像避免在运行镜像中保留编译环境。第二步编写启动脚本并注入环境变量vjstar仓库在 vjstar/src/main/script/docker-cpus 目录下给出了可直接套用的启动脚本。脚本完成两件事定义环境变量LD_PRELOAD把libsysconfcpus.so放在最前面达到截获的目的读取容器平台注入的 CPU 核数环境变量转换为 libsysconfcpus 所需的LIBSYSCONFCPUS。脚本原文以仓库为准#!/bin/sh if [ x$CONTAINER_CORE_REQUEST ! x ]; then LIBSYSCONFCPUS$CONTAINER_CORE_REQUEST if [ ${LIBSYSCONFCPUS} -lt 2 ]; then LIBSYSCONFCPUS2 fi export LIBSYSCONFCPUS fi export LD_PRELOAD/usr/local/lib/libsysconfcpus.so:$LD_PRELOAD逐行解读脚本片段作用if [ x$CONTAINER_CORE_REQUEST ! x ]; then判断容器平台是否注入了核数环境变量。x前缀是 POSIX Shell 防止变量为空时产生语法歧义的惯用写法LIBSYSCONFCPUS$CONTAINER_CORE_REQUEST把容器分配的核数转交给 libsysconfcpus 读取的环境变量if [ ${LIBSYSCONFCPUS} -lt 2 ]; then LIBSYSCONFCPUS2; fi强制核数下限为 2规避-server模式启动死锁问题见下文export LD_PRELOAD/usr/local/lib/libsysconfcpus.so:$LD_PRELOAD将 so 文件置于LD_PRELOAD最前面并保留原有项确保截获优先生效关于环境变量命名的两个说明原文档中提到部署容器时会额外传入一个环境变量CONTAINER_CORE_LIMIT代表分配的 CPU 核数而仓库脚本实际读取的是CONTAINER_CORE_REQUEST。两者并不一致使用时需按自己的情况修改如果你的容器平台注入的是CONTAINER_CORE_LIMIT或 Kubernetes 的resources.limits.cpu换算值请把脚本中的变量名替换为对应名称。若容器平台未注入任何核数环境变量LIBSYSCONFCPUS不会被设置此时 libsysconfcpus 将退化为透传真实的sysconf返回值不会破坏原有行为。关键警告-server模式至少需要 2 核原文档特别强调当 JVM 以-server启动时至少需要 2 核否则在启动时会被死锁。这正是脚本中LIBSYSCONFCPUS2下限存在的原因——即使容器只分配了 1 核也要向 JVM 报告 2 核避免服务器模式下线程与优化逻辑不足导致启动卡死。这个下限建议在生产环境保持默认不要随意下调。第三步与 JVM 启动参数脚本集成vjstar模块同时提供了完整的 JVM 启动参数推荐脚本。集成时将上述 docker-cpus 脚本与 jvm-options.sh 一起引入应用启动流程# 1. 先执行 docker-cpus 脚本完成 LD_PRELOAD 与 LIBSYSCONFCPUS 注入 source ./docker-cpus.sh # 2. 再加载 JVM 参数推荐脚本内部会按 JDK 版本自动适配 source ./jvm-options.sh # 3. 使用输出的 JAVA_OPTS 启动应用 java $JAVA_OPTS -jar your-app.jar值得留意的是jvm-options.sh 中有一条与容器 CPU 感知直接相关的注释如果 JVM 并不独占机器机器上有其他较繁忙的进程在运行将 GC 线程数设置得比默认值CPU核数5/8更低以减少竞争反而会大大加快 YGC 速度。在容器场景下这恰好印证了 CPU 核数失真会传导到 GC 线程数的论断——补丁修正核数后GC 线程数才会按容器配额计算而多容器共享宿主机时仍可按需进一步手工压低-XX:ParallelGCThreads与-XX:ConcGCThreads。验证补丁是否生效补丁注入后可通过以下方式验证1. 检查进程环境变量# 查看 JVM 进程的 LD_PRELOAD 与 LIBSYSCONFCPUS cat /proc/pid/environ | tr \0 \n | grep -E LD_PRELOAD|LIBSYSCONFCPUS2. 观察 JVM 实际感知的核数jinfo -flag PrintFlagsFinal pid 2/dev/null | grep -E ActiveProcessorCount # 或直接通过 JMX # java.lang.management.OperatingSystemMXBean.getAvailableProcessors()3. 观察 GC 线程数是否符合预期jinfo -flag ParallelGCThreads pid若补丁未生效优先检查so 文件路径是否与LD_PRELOAD一致、LD_PRELOAD是否被后续脚本覆盖应使用追加而非覆盖、以及环境变量注入是否发生在 JVM 进程启动之前。与 vjstar 其他最佳实践的配合docker-cpus 补丁只是 vjstar 模块服务化应用性能与可用性最佳实践的一部分它与其他实践共同构成容器化 JVM 的完整治理方案JVM 启动参数见 jvm-options.sh涵盖内存、GC、日志、排查与 JMX 等全量参数按 JDK 版本自动适配闲时主动 GC见 ProactiveGcTask.java 与 CleanUpScheduler.java在夜半闲时检测老生代占用达到阈值如 50%后主动触发一次 CMS GC通过随机时延避免所有实例同时清理对应的可运行示例见 ProactiveGcTaskDemo.java滑动窗口计数器见 RequestSlidingWindow.java用于任意时刻最近一分钟请求数统计、熔断计算等场景。小结容器中 JVM 读取宿主机 CPU 核数是容器化迁移的常见坑。唯品会在vjstar中沉淀的 docker-cpus 补丁以LD_PRELOAD截获sysconf(_SC_NPROCESSORS_CONF)的方式在不修改应用代码、不依赖特定 JDK 版本的前提下为 JVM 注入真实核数配合-server模式至少 2 核的下限保护可以安全地用于生产环境。完整脚本与配套的 JVM 参数最佳实践均可在仓库的 vjstar/src/main/script/docker-cpus/README.md 与 vjstar 模块中直接查阅与复用。赞分享开发工具可观测性后端【免费下载链接】vjtoolsThe vip.coms java coding standard, libraries and tools项目地址https://gitcode.com/gh_mirrors/vj/vjtools点击查看免费下载相关推荐MEGAcmd开发者指南理解架构、编译源码与贡献代码MEGAcmd开发者指南理解架构、编译源码与贡献代码 MEGAcmd是一款功能强大的命令行交互和脚本应用专为访问MEGA云存储服务设计。本指南将帮助开发者深vjstar 服务化应用性能与可用性最佳实践JVM 参数、容器 CPU 识别、闲时主动 GC 与滑动窗口计数器全解析vjstar 服务化应用性能与可用性最佳实践JVM 参数、容器 CPU 识别、闲时主动 GC 与滑动窗口计数器全解析 vjstar 是 vjtools 仓库中开发工具可观测性后端上一篇告别手动操作github-release 一键搞定 GitHub Releases 全流程下一篇CardKit部署指南在Web应用和服务器环境中正确部署图像编辑器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

EGM96球谐系数解析与C#实现:重力异常、高程异常、垂线偏差一次算清
EGM96球谐系数解析与C#实现:重力异常、高程异常、垂线偏差一次算清

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/28 2:55:14

【双机位A卷】华为OD笔试之【排序】双机位A-日志时间排序【Py/Java/C++/C/JS/Go六种语言】【欧弟算法】全网注释最详细分类最全的华子OD真题题解
【双机位A卷】华为OD笔试之【排序】双机位A-日志时间排序【Py/Java/C++/C/JS/Go六种语言】【欧弟算法】全网注释最详细分类最全的华子OD真题题解

可上 欧弟OJ系统 练习华子OD、大厂真题 绿色聊天软件戳 od1441了解算法冲刺训练(备注【CSDN】否则不通过) 文章目录 相关推荐阅读 题目描述与示例 题目描述 输入描述 输出描述 示例一 输入 输出 示例二 输入 输出 解题思路 代码 Python Java C++ C Node JavaScript Go 时空复… · 2026/9/28 2:55:14

STM32非官方FOC板卡配置实战:从WorkBench到CubeMX全流程避坑指南
STM32非官方FOC板卡配置实战:从WorkBench到CubeMX全流程避坑指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/28 2:55:14

Spingboot启动预热的实现
Spingboot启动预热的实现

启动预热的适用场景启动预热适合以下情况:数据主要来自第三方接口,无法直接从本地数据库读取。第三方接口响应较慢,首次访问容易超时。一个页面需要调用多个第三方接口或逐项查询。数据读取频繁,但变化不频繁。希望服务启动后&… · 2026/9/28 3:40:12

Understanding Driving Risks using Large Language Models: Toward Elderly Driver Assessment
Understanding Driving Risks using Large Language Models: Toward Elderly Driver Assessment

文章主要内容总结 本文研究了多模态大语言模型(具体为ChatGPT-4o)利用静态行车记录仪图像进行类人交通场景解读的潜力,重点聚焦与老年司机评估相关的三项任务:交通密度评估、交叉口可见性评估和停车标志识别。这些任务需上下文推理而非简单目标检测。研究采用零样本、少样… · 2026/9/28 3:32:43

Leveraging Large Language Models for Classifying App Users‘ Feedback
Leveraging Large Language Models for Classifying App Users‘ Feedback

文章主要内容总结 本文聚焦于利用大型语言模型(LLMs)解决应用用户反馈分类的挑战,传统方法依赖有监督机器学习,但受限于标注数据集的规模和质量。研究通过三个核心实验评估了4种先进LLMs(GPT-3.5-Turbo、GPT-4o、Flan-T5、Llama3-70b)的性能: LLMs在用户反馈分类中的基… · 2026/9/28 3:32:43

Using Large Language Models for Legal Decision-Making in Austrian Value-Added Tax Law: An Experim...
Using Large Language Models for Legal Decision-Making in Austrian Value-Added Tax Law: An Experim...

文章主要内容总结 本文通过实验评估了大型语言模型(LLMs)在奥地利及欧盟增值税(VAT)法框架下辅助法律决策的能力。研究聚焦于两种提升LLM性能的方法——微调(fine-tuning)和检索增强生成(RAG),并在两类案例中进行验证:一是权威教科书案例,二是税务咨询公司的真实案… · 2026/9/28 3:32:43

学Java别走弯路,这5个方向最吃香
学Java别走弯路,这5个方向最吃香

学Java的人很多,但学明白的人不多。有人学了半年还在写控制台程序,有人一年就能独当一面。差别不在天赋,而在方向。Java生态太庞大了,什么都学等于什么都没学。选对方向,事半功倍。今天盘点当前最吃香的5个Java方向&am… · 2026/9/28 3:32:15

AlphaAgents: Large Language Model based Multi-Agents for Equity Portfolio Constructions
AlphaAgents: Large Language Model based Multi-Agents for Equity Portfolio Constructions

AlphaAgents相关总结与翻译 一、文章主要内容总结 (一)研究背景与问题 传统股票投资组合管理依赖人类分析师处理海量信息(如财务披露、财报、市场新闻等),存在信息处理效率低、易受认知偏差(如损失厌恶、过度自信)影响的问题,可能错失投资收益机会。尽管AI在数据处理… · 2026/9/28 3:32:08

MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现
MATLAB雷达信号脉冲压缩仿真:LFM线性调频、匹配滤波与距离分辨率实现

简介:这套Matlab仿真工具完整呈现雷达信号脉冲压缩过程,从线性调频(LFM)信号生成、目标回波仿真到匹配滤波压缩处理均有可运行代码支撑,面向电子信息工程、计算机、数学等专业学生,适用于课程设计、期末大作… · 2026/9/27 0:00:01

汕头网站建设制作厂家避坑指南:5大注意事项救急
汕头网站建设制作厂家避坑指南:5大注意事项救急

汕头网站建设制作厂家避坑指南:5大注意事项救急 改个需求建站公司拖一周,这种憋屈事我见得太多了。 很多汕头老板找本地建站团队,签合同前看着方案挺美,一上线就变脸。 今天不聊虚的,直接拆解找 汕头网站建设制作厂家 时的5个核心 注意事项… · 2026/9/27 0:00:01

多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习
多模态虚假新闻检测实战:BERT+ResNet双塔与对比学习

简介:基于PyTorch的多模态虚假新闻检测项目完整代码包,面向自然语言处理与计算机视觉交叉方向的开发者、科研人员及毕业设计选题者,解决社交媒体中文本与图像联合识别虚假新闻的问题。系统以BERT预训练模型提取文本语义特征,以Res… · 2026/9/27 0:00:01

制作网页比较方便的软件怎么选?一文搞懂避坑指南
制作网页比较方便的软件怎么选?一文搞懂避坑指南

制作网页比较方便的软件怎么选?一文搞懂避坑指南 很多老板一上来就问:做个网站多少钱?但我反问他:你的域名买了吗?服务器租了吗?他一脸懵。这就是典型的“域名服务器搞不懂”。别急,今天咱们不聊虚的,直接 一文搞懂 那些让你头秃的技术名词。… · 2026/9/28 0:00:06

婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量
婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量

婚恋网站实战案例:避开3个高价坑,省钱50%还能跑赢流量 找婚恋网站建站公司,最怕的就是被坑高价。很多同行跟我吐槽,报价单上写得模棱两可,功能栏里全是“高级定制”、“专属UI”,结果落地全是套壳。今天不聊虚的,直接甩几个我经手的 实战案例… · 2026/9/28 0:00:19

济南做网站多少钱:3个案例拆解,防黑源码下载全攻略
济南做网站多少钱:3个案例拆解,防黑源码下载全攻略

济南做网站多少钱:3个案例拆解,防黑源码下载全攻略 上周济南一个做建材的老板找我,脸都绿了。他的官网首页弹出了赌博广告,后台被植入了挖矿脚本。他慌得问我:“网站被黑挂马不知道怎么办?能不能直接找之前的外包公司要源码下载,看看哪里被动了手脚?… · 2026/9/28 0:00:25

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码