博客

  • stable-diffusion-webui安装过程

    1.conda创建3.10.6环境, 目前3.10.6支持的比较好
    conda create -n python310_stableai python==3.10.6

    2.激活新的conda环境
    conda activate python310_stableai

    3.安装pytorch
    下载地址:https://pytorch.org/get-started/locally/
    本机cuda:11.7.101
    pip3 install torch torchvision torchaudio –extra-index-url https://download.pytorch.org/whl/cu117

    4.下载stable-diffusion-webui
    git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui

    5.下载模型stable-diffusion-v-1-4-original
    1).最新官方模型地址:https://huggingface.co/CompVis/stable-diffusion-v-1-4-original
    2).下载sd-v1-4.ckpt模型(大小约4G)
    3).https://huggingface.co/CompVis/stable-diffusion-v-1-4-original/resolve/main/sd-v1-4.ckpt

    1. 将模型文件放到stable-diffusion-webui下的models\Stable-diffusion目录下:
      修改sd-v1-4.ckpt模型名字为:model.ckpt
      放到stable-diffusion-webui\models\Stable-diffusion目录下
    2. 安装diffusion
      1).进入stable-diffusion-webui目录(在python310_stableai环境下)
      2). 执行 python launch.py
      3).大概等待20多分钟,下载各种依赖
      4). 出现”Running on local URL: http://127.0.0.1:7860″ 表示运行成功
    3. 问题
      1)安装open_clip失败
      把launch.py 中的”https://github.com/mlfoundations/open_clip.git”替换为”https://gitee.com/ufhy/open_clip.git”,然后重新运行python launch.py
  • 2022年python库大全

    Python 的数据结构,算法和设计模式的实现。另请参阅真棒算法

    • 演算法
    • 设计模式
      • PyPattyrn- 一个简单但有效的库,用于实现常见的设计模式。
      • python-patterns -Python 中设计模式的集合。
      • transitions – 一种轻量级的,面向对象的有限状态机实现。

    二、声音、视频、图像、文字处理#

    用于处理音频及其元数据的库。#

    • 声音的
      • audioread- 跨库(GStreamer + 核心音频 + MAD + FFmpeg)音频解码。
      • dejavu- 音频指纹识别。
      • kapreKeras 音频预处理器
      • librosa- 用于音频和音乐分析的 Python 库
      • matchering – 一个用于自动参考音频制作的库。
      • mingus- 带有 MIDI 文件和播放支持的高级音乐理论和乐谱包。
      • pyAudioAnalysis- 音频特征提取,分类,分段和应用。
      • pydub- 使用简单易用的高级界面处理音频。
      • TimeSide- 开放的 Web 音频处理框架。
    • Metadata
      • beets– 音乐库管理器和 MusicBrainz 标记器。
      • eyeD3- 一种用于处理音频文件的工具,特别是包含 ID3 元数据的 MP3 文件。
      • mutagen- 处理音频元数据的 Python 模块。
      • tinytag- 用于读取 MP3,OGG,FLAC 和 Wave 文件的音乐元数据的库。

    用于处理视频和 GIF 的库。

    • moviepy- 用于基于脚本的电影编辑的模块,具有多种格式,包括动画 GIF。
    • scikit-video -SciPy 的视频处理例程。
    • vidgear- 最强大的多线程视频处理框架。

    用于处理图像的库。#

    • hmap- 图像直方图重新映射。
    • imgSeek- 使用视觉相似性搜索图像集合的项目。
    • nude.py- 裸露检测。
    • pagan – 复古 identicon(阿凡达)根据输入的字符串和哈希生成。
    • pillow– 枕头是友好的 PIL 叉。
    • python- barcode – 在 Python 中创建条形码,没有任何额外的依赖关系。
    • pygram- 类似 Instagram 的图像过滤器。
    • PyMatting -Alpha 遮罩的库。
    • python-qrcode- 一个纯 Python QR Code 生成器。
    • pywal- 一种从图像生成配色方案的工具。
    • pyvips- 具有低内存需求的快速图像处理库。
    • Quads – 基于四叉树的计算机艺术。
    • scikit-image- 用于(科学)图像处理的 Python 库。
    • thumbor- 智能影像服务。它可以按需裁剪,调整图像大小和翻转图像。
    • wandMagickWand 的 Python 绑定,ImageMagick 的 C API。

    用于解析和处理纯文本的库。#


    三、日期和时间#

    用于处理日期和时间的库。#

    • Arrow- 一个 Python 库,提供了一种明智且人性化的方法来创建,操作,格式化和转换日期,时间和时间戳。
    • Chronyk- 一个 Python 3 库,用于解析人类编写的时间和日期。
    • dateutil- 标准 Python datetime 模块的扩展。
    • delorean- 一个库,用于清除与日期时间有关的不便的事实。
    • maya- 人类的日期时间。
    • moment – 一个 Python 库用于处理日期 / 时间。受到 Moment.js 的启发。
    • Pendulum-Python 日期时间变得容易。
    • PyTime- 一个易于使用的 Python 模块,旨在按字符串操作日期 / 时间 / 日期时间。
    • pytz- 世界时区定义,现代和历史。将 tz 数据库带入 Python。
    • when.py- 提供用户友好的功能来帮助执行常见的日期和时间操作。

    四、爬虫#

    自动执行 Web 抓取。

    用于提取 Web 内容的库。

    • html2text- 将 HTML 转换为 Markdown 格式的文本。
    • lassie- 人类的 Web 内容检索。
    • micawber- 一个小型库,用于从 URL 中提取丰富的内容。
    • newspaper -Python 中的新闻提取,文章提取和内容管理。
    • python- readability arc90 的可读性工具的快速 Python 端口。
    • requests-html –适用于人类的 Pythonic HTML 解析。
    • sumy- 自动汇总文本文档和 HTML 页面的模块。
    • textract- 从任何文档,Word,PowerPoint,PDF 等中提取文本
    • toapi- 每个网站都提供 API。

    五、HTML、XML#

    用于处理 HTML 和 XML 的库。

    • BeautifulSoup- 提供 Pythonic 惯用法来迭代,搜索和修改 HTML 或 XML。
    • bleach –基于白名单 HTML 清理和文本 linkification 库中的。
    • cssutils- 一个 Python 的 CSS 库。
    • html5lib- 一个符合标准的库,用于解析和序列化 HTML 文档和片段。
    • lxml- 一个非常快速,易于使用的通用库,用于处理 HTML 和 XML。
    • MarkupSafe- 为 Python 实现 XML / HTML / XHTML 标记安全字符串。
    • pyquery- 用于解析 HTML 的类似 jQuery 的库。
    • untangle –将 XML 文档转换为 Python 对象,以方便访问。
    • WeasyPrint- 用于 HTML 和 CSS 的可视渲染引擎,可以导出为 PDF。
    • xmldataset- 简单的 XML 解析。
    • xmltodict- 使用 XML 就像使用 JSON。

    六、HTTP 客户端#

    使用 HTTP 的库。#

    • grequests- 异步 HTTP 请求的 request + gevent。
    • httplib2- 全面的 HTTP 客户端库。
    • httpx- 用于 Python 的下一代 HTTP 客户端。
    • requests -HTTP 对人类的请求。
    • treq -Python 请求,例如在 Twisted 的 HTTP 客户端之上构建的 API。

    七、office 模块#

    用于解析和处理特定文本格式的库。

    • General
      • tablib -XLS,CSV,JSON,YAML 中的表格数据集的模块。
    • Office
      • docxtpl- 通过 jinja2 模板编辑 docx 文档
      • openpyxl- 用于读取和写入 Excel 2010 xlsx /xlsm/xltx /xltm 文件的库。
      • pyexcel- 提供一个用于读取,操作和写入 csv,ods,xls,xlsx 和 xlsm 文件的 API。
      • python-docx- 读取,查询和修改 Microsoft Word 2007/2008 docx 文件。
      • python-pptx- 用于创建和更新 PowerPoint(.pptx)文件的 Python 库。
      • unoconv- 在 LibreOffice / OpenOffice 支持的任何文档格式之间转换。
      • XlsxWriter- 一个用于创建 Excel .xlsx 文件的 Python 模块。
      • xlwings -BSD 许可的库,可以轻松地从 Excel 调用 Python,反之亦然。
      • xlwt / xlrd- 从 Excel 文件写入和读取数据以及格式化信息。
    • PDF 格式
      • PDFMiner- 一种从 PDF 文档提取信息的工具。
      • PyPDF2- 一个能够拆分,合并和转换 PDF 页面的库。
      • ReportLab- 允许快速创建丰富的 PDF 文档。
    • Markdown
    • YAML
      • PyYAML- 适用于 Python 的 YAML 实现。
    • CSV
      • csvkit- 转换为 CSV 并使用 CSV 的实用程序。
    • Archive
      • unp- 一个命令行工具,可以轻松地解压缩档案。

    八、序列化#

    用于序列化复杂数据类型的库


    九、代码分析、测试#

    码质量检查器的工具。另请参阅令人敬畏的静态分析#

    • 代码分析
      • Coala- 语言独立且易于扩展的代码分析应用程序。
      • code2flow- 将您的 Python 和 JavaScript 代码转换为 DOT 流程图。
      • prospector– 分析 Python 代码的工具。
      • pycallgraph- 一个可视化 Python 应用程序流程(调用图)的库。
      • vulture- 查找和分析无效的 Python 代码的工具。
    • Code Linters
    • 代码格式化程序
      • black –毫不妥协的 Python 代码格式化程序。
      • isort- 用于对导入进行排序的 Python 实用程序 / 库。
      • yapf- 另一个来自 Google 的 Python 代码格式化程序。
    • 静态类型检查器,另请参见 awesome-python-typing
    • 静态类型注释生成器
      • MonkeyType- 一个用于 Python 的系统,通过收集运行时类型来生成静态类型注释。
      • pyannotate- 自动生成 PEP-484 注释。
      • pytype -pytype 检查并推断 Python 代码的类型 – 无需类型注释。

    渗透测试的框架和工具。#

    用于测试代码库和生成测试数据的库。#

    • 测试框架
      • hypothesis –假设是一个高级的 Quickcheck 样式基于属性的测试库。
      • nose2 nose 基于 `unittest2。的后继者。
      • pytest- 一个成熟的功能齐全的 Python 测试工具。
      • Robot Framework 通用的测试自动化框架。
      • unittest-(Python 标准库)单元测试框架。
    • 测试选手
      • green – 干净,多彩的测试运行器。
      • mamba -Python 的权威测试工具。生于 BDD 的旗帜下。
      • tox- 自动构建和测试多个 Python 版本的发行版
    • GUI / Web 测试
      • locust- 用 Python 编写的可扩展用户负载测试工具。
      • PyAutoGUI -PyAutoGUI 是适用于人类的跨平台 GUI 自动化 Python 模块。
      • Schemathesis- 用于对基于 Open API / Swagger 规范构建的 Web 应用程序进行基于属性的自动测试的工具。
      • SeleniumSelenium WebDriver 的 Python 绑定。
      • sixpack- 与语言无关的 A / B 测试框架。
      • splinter- 用于测试 Web 应用程序的开源工具。
    • Mock
      • doublex- 强大的 Python 测试框架加倍。
      • Frozengun- 通过模拟 datetime 模块来穿越时间。
      • httmock- 一个针对 Python 2.6 + 和 3.2 + 的请求的模拟库。
      • httpretty- 适用于 Python 的 HTTP 请求模拟工具。
      • mock-(Python 标准库)一个模拟和修补库。
      • mocket – 具有 gevent /asyncio/ SSL 支持的套接字模拟框架。
      • responses 一个实用程序库,用于模拟请求 Python 库。
      • VCR.py- 记录并重放测试中的 HTTP 交互。
    • 对象工厂
      • factory_boy -Python 的测试装置替代品。
      • mixer– 另一种灯具更换。支持 Django,Flask,SQLAlchemy,Peewee 等
      • model_mommy- 创建随机夹具以在 Django 中进行测试。
    • 代码覆盖率
    • 伪数据
      • fake2db- 伪数据库生成器。
      • faker- 一个生成伪造数据的 Python 包。
      • mimesis- 是一个 Python 库,可帮助您生成虚假数据。
      • radar – 生成随机的日期时间 / 时间。

    用于验证数据的库。#

    • Cerberus- 一个轻量级和可扩展的数据验证库。
    • colander- 验证和反序列化通过 XML,JSON 和 HTML 表单发布获得的数据。
    • jsonschema – Python 的 JSON 模式的实现。
    • schema- 用于验证 Python 数据结构的库。
    • Schematics –数据结构验证。
    • valideer – 轻量级可扩展数据验证和适配库。
    • voluptuous – 的 – 一个 Python 数据验证库。

    十、web 框架#

    传统的全栈 Web 框架。另请参阅 RESTful API


    十一、搜索#

    用于对数据建立索引并执行搜索查询的库和软件。#


    十二、日志记录#

    用于生成和使用日志的库。

    • logbook – – 记录 Python 的替换记录。
    • logging-(Python 标准库)Python 的日志记录工具。
    • loguru- 旨在以 Python 带来令人愉悦的日志记录的库。
    • sentry- python – 适用于 Python 的 Sentry SDK。
    • structlog- 结构化日志变得容易。

    十三、并发与并行#

    用于并发和并行执行的库。另请参阅 awesome-asyncio


    十四、任务队列#

    用于处理任务队列的库。

    • celery- 基于分布式消息传递的异步任务队列 / 作业队列。
    • Dramatiq- 用于 Python 3 的快速可靠的后台任务处理库。
    • huey- 小多线程任务队列。
    • mrq- 使用 Redis 和 gevent 的 Python 中的分布式工作者任务队列。
    • rq -Python 的简单作业队列。

    十五、自然语言处理#

    用于使用人类语言的图书馆。

    • 一般的
      • gensim- 人类主题建模。
      • langid.py- 独立的语言识别系统。
      • nltk- 用于构建 Python 程序以使用人类语言数据的领先平台。
      • pattern- 一个 Web 挖掘模块。
      • polyglot- 支持数百种语言的自然语言管道。
      • pytext 的 – 基于 PyTorch 自然语言建模框架。
      • PyTorch-NLP- 一种工具包,可用于研究的快速深度学习 NLP 原型。
      • spacy – 一种用于 Python 和用 Cython 工业强度的自然语言处理库。
      • Stanza -Stanford NLP Group 的官方 Python 库,支持 60 多种语言。
    • 中国人
      • funNLP- 中国 NLP 的工具和数据集的集合。
      • jieba- 最受欢迎的中文文本分割库。
      • pkuseg-python- 用于各种领域的中文分词的工具包。
      • snownlp- 用于处理中文文本的库。

    十六、深度学习、机器学习计算机视觉#

    神经网络和深度学习框架。另请参阅真棒深度学习#

    • caffe- 深度学习的快速开放框架。
    • keras- 一个高级神经网络库,能够在 TensorFlow 或 Theano 之上运行。
    • mxnet- 专为效率和灵活性而设计的深度学习框架。
    • pytorch- 具有强大 GPU 加速功能的 Python 中的张量和动态神经网络。
    • SerpentAI- 游戏代理框架。使用任何视频游戏作为深度学习沙箱。
    • tensorflow- 由 Google 创建的最受欢迎的深度学习框架。
    • Theano- 一个用于快速数值计算的库。

    机器学习图书馆。另请参阅很棒的机器学习#

    • 健身房 – 用于开发和比较强化学习算法的工具包。
    • H2O- 开源快速可扩展机器学习平台。
    • 指标 – 机器学习评估指标。
    • NuPIC -Numenta 智能计算平台。
    • scikit-learn- 最受欢迎的机器学习 Python 库。
    • Spark MLApache Spark 的可扩展机器学习库。
    • vowpal_porpoise- 用于 Vowpal Wabbit 的轻量级 Python 包装器。
    • xgboost- 一个可扩展,可移植和分布式的梯度增强库。
    • MindsDB -MindsDB 是现有数据库的开源 AI 层,可让您使用标准查询轻松地开发,训练和部署最新的机器学习模型。

    计算机视觉图书馆。#


    十七、数据分析、可视化#

    用于数据分析的库。#

    • AWS Data Wrangler -AWS 上的 Pandas。
    • Blaze -NumPy 和 Pandas 连接到大数据。
    • Pandas 界面中的 Open Mining- 商业智能(BI)。
    • Optimus –敏捷数据科学的工作流程变得容易与 PySpark。
    • Orange –通过可视化编程或脚本进行数据挖掘,数据可视化,分析和机器学习。
    • Pandas- 一个提供高性能,易于使用的数据结构和数据分析工具的库。

    用于可视化数据的库。另请参阅 awesome-javascript#

    • Altair- 用于 Python 的声明性统计可视化库。
    • Bokeh- 用于 Python 的交互式 Web 绘图。
    • bqplot -Jupyter Notebook 的交互式绘图库
    • Cartopy- 具有 matplotlib 支持的制图 python 库
    • 短跑 – 建立在烧瓶顶部,反应,Plotly 旨在分析 Web 应用程序。
    • 图表 – 图表为代码。
    • Matplotlib- 一个 Python 2D 绘图库。
    • plotnine- 基于 ggplot2 的 Python 图形语法。
    • Pygal- 一个 Python SVG 图表创建器。
    • PyGraphvizGraphviz 的 Python 接口。
    • PyQtGraph- 交互式和实时 2D / 3D / 图像绘制以及科学 / 工程小部件。
    • Seaborn – 使用 Matplotlib 统计数据可视化。
    • VisPy- 基于 OpenGL 的高性能科学可视化。

    十八、数据库驱动程序#

    用于连接和操作数据库的库。#


    十九、DevOps 工具#

    DevOps 的软件和库。

    • 配置管理
      • ansible- 一个非常简单的 IT 自动化平台。
      • cloudinit- 一个多分发包,用于处理云实例的早期初始化。
      • OpenStack- 用于构建私有和公共云的开源软件。
      • pyinfra- 通用的 CLI 工具和 python 库,可自动执行基础架构。
      • saltstack- 基础结构自动化和管理系统。
    • SSH 样式的部署
      • cuisine – 类似于 Fabric 的厨师功能。
      • fabric – 一个简单的,Python 化工具,用于远程执行和部署。
      • fabtools- 编写很棒的 Fabric 文件的工具。
    • 流程管理
      • honchoForeman 的 Python 克隆,用于管理基于 Procfile 的应用程序。
      • supervisor – 用于 UNIX 监事过程控制系统。
    • 监控方式
      • psutil- 跨平台的流程和系统实用程序模块。
    • 后备
      • BorgBackup- 具有压缩和加密功能的重复数据删除存档器。
    • 其他

    二十、分布式计算#

    分布式计算的框架和库。#

    • 批量处理
      • dask- 用于分析计算的灵活并行计算库。
      • luigi- 一个模块,可帮助您构建批处理作业的复杂管道。
      • mrjob- 在 Hadoop 或 Amazon Web Services 上运行 MapReduce 作业。
      • PySparkApache Spark Python API。
      • Ray- 用于并行和分布式 Python 的系统,统一了机器学习生态系统。
    • 流处理

    二十一、配置、打包构建#

    用于存储和解析配置选项的库。#

    • configobj- 带有验证的 INI 文件解析器。
    • configparser-(Python 标准库)INI 文件解析器。
    • hydra -Hydra 是用于优雅配置复杂应用程序的框架。
    • profig- 使用值转换从多种格式进行配置。
    • python-decouple- 严格将设置与代码分开。

    用于创建打包的可执行文件以进行发行的库。#

    • dh-virtualenv- 以 Debian 软件包的形式构建和分发 virtualenv。
    • Nuitka – 将脚本,模块,程序包编译为可执行文件或扩展模块。
    • py2app- 冻结 Python 脚本(Mac OS X)。
    • py2exe- 冻结 Python 脚本(Windows)。
    • pyarmor- 一种用于混淆 python 脚本,将混淆后的脚本绑定到固定计算机或使混淆后的脚本失效的工具。
    • PyInstaller- 将 Python 程序转换为独立的可执行文件(跨平台)。
    • pynsist- 用于构建 Windows 安装程序的工具,安装程序将 Python 本身捆绑在一起。
    • shiv- 命令行实用程序,用于构建完全独立的 zipapp(PEP 441),但包括其所有依赖项。

    二十二、虚拟环境#

    用于 Python 版本和虚拟环境管理的库。

    • pyenv- 简单的 Python 版本管理。
    • virtualenv- 创建隔离的 Python 环境的工具。

    二十三、界面开发#

    用于处理图形用户界面应用程序的库。

    • curses – – 内置包装器 ncurses 的用于创建终端 GUI 的应用程序。
    • Eel- 一个用于制作简单的类似于电子的脱机 HTML / JS GUI 应用程序的库。
    • enaml- 使用声明性语法(如 QML)创建漂亮的用户界面。
    • Flexx -Flexx 是用于创建 GUI 的纯 Python 工具包,它使用 Web 技术进行呈现。
    • Gooey – 使用命令行将命令行程序转换为完整的 GUI 应用程序。
    • kivy- 用于创建 NUI 应用程序的库,可在 Windows,Linux,Mac OS X,Android 和 iOS 上运行。
    • pyglet -Python 的跨平台窗口和多媒体库。
    • PyGObject -GLib / GObject / GIO / GTK +(GTK + 3)的 Python 绑定。
    • PyQtQt 跨平台应用程序和 UI 框架的 Python 绑定。
    • PySimpleGUItkinter,Qt,WxPython 和 Remi 的包装。
    • pywebview- 围绕 webview 组件的轻量级跨平台本机包装器。
    • Tkinter -Tkinter 是 Python 的事实上的标准 GUI 软件包。
    • Toga -Python 本机,OS 本机 GUI 工具箱。
    • urwid- 一个用于创建终端 GUI 应用程序的库,该库对小部件,事件,丰富的颜色等具有强大的支持。
    • wxPython -wxWidgets C ++ 类库与 Python 的混合。
    • DearPyGui- 一个简单的 GPU 加速的 Python GUI 框架

    二十四、游戏开发#

    很棒的游戏开发库。

    • Arcade -Arcade 是一个现代 Python 框架,用于制作具有引人注目的图形和声音的游戏。
    • Cocos2d -cocos2d 是用于构建 2D 游戏,演示和其他图形 / 交互应用程序的框架。
    • Harfang3D- 用于 3D,VR 和游戏开发的 Python 框架。
    • Panda3D- 迪士尼开发的 3D 游戏引擎。
    • Pygame -Pygame 是一组旨在编写游戏的 Python 模块。
    • PyOgre -Ogre 3D 渲染引擎的 Python 绑定,可用于游戏,模拟或任何 3D。
    • PyOpenGL -OpenGL 及其相关 API 的 Python ctypes 绑定。
    • PySDL2 -SDL2 库的基于 ctypes 的包装器。
    • RenPy- 一个视觉小说引擎

    二十五、任务调度器#

    用于计划作业的库。#

    • Airflow 气流是一个以编程方式编写,安排和监视工作流的平台。
    • APScheduler- 轻巧但功能强大的进程内任务计划程序,可让您计划功能。
    • django-schedule -Django 的日历应用程序。
    • doit- 一个任务运行器和构建工具。
    • gunnery – 具有基于 Web 界面的分布式系统的多用途任务执行工具。
    • Joblib- 一套在 Python 中提供轻量级流水线的工具。
    • Plan – 像用吊饰一样用 Python 编写 crontab 文件。
    • Prefect- 一个现代的工作流程编排框架,可轻松构建,调度和监视强大的数据管道。
    • schedule- 针对人类的 Python 作业调度。
    • Spiff- 用纯 Python 实现的功能强大的工作流引擎。
    • TaskFlow- 一个 Python 库,可帮助简化,一致且可靠的任务执行

    二十六、科学计算#

    用于科学计算的图书馆。另请参见 Python for-Scientists

    • astropy- 天文学的社区 Python 库。
    • bcbio-nextgen- 提供最佳实践流水线,用于全自动高通量测序分析。
    • bccb- 收集与生物学分析有关的有用代码。
    • Biopython -Biopython 是一套免费的生物计算工具。
    • cclib- 一个用于解析和解释计算化学程序包结果的库。
    • Colour – 实施大量的颜色理论转换和算法。
    • Karate Club – 用于图形结构化数据的无监督机器学习工具箱。
    • NetworkX- 用于复杂网络的高生产率软件。
    • NIPY- 神经影像工具箱的集合。
    • NumPy- 使用 Python 进行科学计算的基本软件包。
    • ObsPy- 地震学的 Python 工具箱。
    • Open Babel- 一种化学工具箱,旨在讲多种化学数据语言。
    • PyDy -Python Dynamics 的缩写,用于协助工作流进行动态运动建模。
    • PyMC- 马尔可夫链蒙特卡洛采样工具包。
    • QuTiP -Python 中的 Quantum Toolbox。
    • RDKit- 化学信息学和机器学习软件。
    • SciPy- 用于数学,科学和工程的基于 Python 的开源软件生态系统。
    • SimPy- 一个基于过程的离散事件模拟框架。
    • statsmodels -Python 中的统计建模和计量经济学。
    • SymPy- 一个用于符号数学的 Python 库。
    • Zipline- 一个 Pythonic 算法交易库。

    RPC#

    RPC 兼容服务器。

    • RPyC(远程 Python 调用)- 用于 Python 的透明且对称的 RPC 库
    • zeroRPC -zerorpc 是基于 ZeroMQMessagePack 的灵活 RPC 实现。

  • ICE Server与信令Server

    ICE Server:
    (1)分为stun/turn 两部分, 实现p2p连接建立
    (2)stun server: 负责p2p连接建立和媒体格式协商
    (3)turn server: 负责数据转发。如果p2p连接成功,则turn服务没有用武之地;如果p2p连接建立失败, 则会通过turn server转发数据,此时,turn server根据需求,需要一个合适的带宽

    开源的ICE Server:Coturn。 在Coturn中stun server与turn server为同一个server

    Signaling Server(信令服务):
    帮助p2p连接建立。 在p2p连接建立之前,客户端和服务端的数据交互是通过信令server中转完成的

  • linux 安装canvas报错

    linux 安装canvas报错

    gyp: Call to ‘pkg-config pixman-1 –libs’ returned exit status 1 while in binding.gyp. while trying to load binding.gyp

    添加 canvas_binary_site的镜像

    npm config set canvas_binary_host_mirror https://registry.npmmirror.com/-/binary/canvas/

  • 从Yahoo财经下载历史数据

    以“苹果股票 AAPL”为例

    日线数据

    https://query1.finance.yahoo.com/v7/finance/chart/AAPL?range=2y&interval=1d&indicators=quote&includeTimestamps=true

    周线数据

    https://query1.finance.yahoo.com/v7/finance/chart/AAPL?range=5y&interval=1wk&indicators=quote&includeTimestamps=true

    月线数据

    https://query1.finance.yahoo.com/v7/finance/chart/AAPL?range=max&interval=1mo&indicators=quote&includeTimestamps=true

    1分钟数据

    https://query1.finance.yahoo.com/v7/finance/chart/AAPL?range=1d&interval=1m&indicators=quote&includeTimestamps=true

    5分钟数据

    https://query1.finance.yahoo.com/v7/finance/chart/AAPL?range=5d&interval=5m&indicators=quote&includeTimestamps=true

    15分钟数据

    https://query1.finance.yahoo.com/v7/finance/chart/AAPL?range=5d&interval=15m&indicators=quote&includeTimestamps=true

    60分钟数据

    https://query1.finance.yahoo.com/v7/finance/chart/AAPL?range=1mo&interval=60m&indicators=quote&includeTimestamps=true
  • Qlib-TypeError: control character ‘delimiter’ cannot be a newline (\r or \n)

    在运行测试代码时候,出现异常

    python workflow_by_code.py

    TypeError: control character ‘delimiter’ cannot be a newline (\r or \n)
    经过检查,conda环境安装的numpy是1.23, 是numpy版本高导致的问题

    1.卸载numpy
    pip uninstall numpy

    2。安装1.22.1版本
    pip install numpy==1.22.1

  • Mysql 同步到ES的最佳实践

    当时由于mysql对全文检索或模糊查询支持的能力不强,需要将数据发送到搜索引擎(如ES)上,由搜索引擎来提供专业的服务。

             在实践中我总结出了以下几种方式。

     

    1同步双写

    这是一种最为简单的方式,在将数据写到mysql时,同时将数据写到ES。

    优点:

    业务逻辑简单。

    缺点:

    1、  硬编码,有需要写入mysql的地方都需要添加写入ES的代码;

    2、  业务强耦合;

    3、  存在双写失败丢数据风险;

    4、  性能较差:本来mysql的性能不是很高,再加一个ES,系统的性能必然会下降。

     

    附:

    上面说的双写失败风险,包括以下几种:

    1)  ES系统不可用;

    2)  程序和ES之间的网络故障;

    3)  程序重启,导致系统来不及写入ES等。

    针对这种情况,有数据强一致性要求的,就必须双写放到事物中来处理,而一旦用上事物,则性能下降更加明显。

    2异步双写(MQ方式)

    针对上面同步的性能和丢数据问题,可以考虑引入MQ,从而形成了上图的方案。

    由于MQ的性能基本比mysql高出一个数量级,所以性能可以得到显著的提高。

     

    优点:

    性能高;

    不存在丢数据问题。

    缺点:

    还存在硬编码、业务强耦合等问题;

    系统中增加了mq的代码,复杂度增加;

    可能存在时延问题,程序的写入性能提高了,但是由于MQ的消费可能由于网络或其它原因导致用户写入的数据不一定可以马上看到。

     

     

    3异步双写(Worker方式)

     

     

    上面2中方案中都存在硬编码问题,也就是有任何对mysq进行增删改查的地方要么植入ES代码,要么替换为MQ代码,代码的侵入性太强,若是实时要求不高的情况下,可以考虑用定时器来处理,具体步骤如下:

    1)  数据库的相关表中增加一个字段为timestamp的字段,任何crud操作都会导致该字段的时间发生变化;

    2)  原来程序中的crud操作不做任何变化;

    3)  增加一个定时器程序(京东内部叫Worker),让该程序按一定的时间周期扫描指定的表,把该时间段内发生变化的数据提取出来;

    4)  逐条写入到ES中。

     

    优点:

    不改变原来代码,没有侵入性、没有硬编码;

    没有业务强耦合;

    不改变原来程序的性能;

    Worker代码编写简单不需要考虑增删改查。

    缺点:

    时效性较差,由于定时器工作周期不可能设在秒级,所以实时性没有上面2中好;

    对数据库有一定的轮询压力,一种改进方法是将轮询放到压力不大的重库上。

     

    4Binlog 同步方式:

    上面三种方案要不有代码侵入、要不有硬编码、要不有时延,那么有没有一种更好的方法?答案就是利用mysql的binlog!

    具体步骤如下:

    1)  读取mysql的binlog日志,获取指定表的日志信息;

    2)  将读取的信息转为MQ;

    3)  编写一个MQ消费程序;

    4)  不断消费MQ,每消费完一条消息,将消息写入到ES中。

    优点:

    没有代码侵入、没有硬编码;

    原有系统不需要任何变化,没有感知;

    性能高;        业务解耦,不需要关注原来系统的业务逻辑。

     

    缺点:

    构建Binlog系统复杂;

    也像方案二,存在MQ延时的风险。

     

     

  • jvm监控-jstack, jconsole, jinfo, jmap, jdb, jstat

    一直没有做过jvm监控, 总以为要找些专门的工具才能做jvm监控, 如jprofile之类的工具, 但这类工具都是收费的。

    经过查找,发现其实sun的jdk中就带有这类工具,从jdk5开始命令行有了jstat,jps,jstatd,图形监控有了jconsole;而到了jdk6,命令有了jmap, jinfo, jstack,图形有了jvisualvm。经过简单试用,这些命令+图形工具 已经足够强大, 能满足一般的监控要求了,如对各类内存、垃圾回收、线程状态的监控。

    命令:

    以下转自:http://hqman.iteye.com/blog/167796

    jstatd
    启动jvm监控服务。它是一个基于rmi的应用,向远程机器提供本机jvm应用程序的信息。默认端口1099。
    实例:jstatd -J-Djava.security.policy=my.policy

    my.policy文件需要自己建立,内如如下:
    grant codebase “file:$JAVA_HOME/lib/tools.jar” {
    permission java.security.AllPermission;
    };
    这是安全策略文件,因为jdk对jvm做了jaas的安全检测,所以我们必须设置一些策略,使得jstatd被允许作网络操作

    jps
    列出所有的jvm实例
    实例:
    jps
    列出本机所有的jvm实例

    jps 192.168.0.77
    列出远程服务器192.168.0.77机器所有的jvm实例,采用rmi协议,默认连接端口为1099
    (前提是远程服务器提供jstatd服务)

    输出内容如下:
    jones@jones:~/data/ebook/java/j2se/jdk_gc$ jps
    6286 Jps
    6174  Jstat

    jconsole
    一个图形化界面,可以观察到java进程的gc,class,内存等信息。虽然比较直观,但是个人还是比较倾向于使用jstat命令(在最后一部分会对jstat作详细的介绍)。

    jinfo(linux下特有)
    观察运行中的java程序的运行环境参数:参数包括Java System属性和JVM命令行参数
    实例:jinfo 2083
    其中2083就是java进程id号,可以用jps得到这个id号。
    输出内容太多了,不在这里一一列举,大家可以自己尝试这个命令。

    jstack(linux下特有)
    可以观察到jvm中当前所有线程的运行情况和线程当前状态
    jstack 2083
    输出内容如下:

    jmap(linux下特有,也是很常用的一个命令)
    观察运行中的jvm物理内存的占用情况。
    参数如下:-heap:打印jvm heap的情况
    *-histo:*打印jvm heap的直方图。其输出信息包括类名,对象数量,对象占用大小。
    *-histo:live :*同上,但是只答应存活对象的情况
    *-permstat:*打印permanent generation heap情况

    命令使用:
    jmap -heap 2083
    可以观察到New Generation(Eden Space,From Space,To Space),tenured generation,Perm Generation的内存使用情况
    输出内容:

    jmap -histo 2083 | jmap -histo:live 2083
    可以观察heap中所有对象的情况(heap中所有生存的对象的情况)。包括对象数量和所占空间大小。
    输出内容:

    写个脚本,可以很快把占用heap最大的对象找出来,对付内存泄漏特别有效。

    jstat
    最后要重点介绍下这个命令。
    这是jdk命令中比较重要,也是相当实用的一个命令,可以观察到classloader,compiler,gc相关信息
    具体参数如下:
    -class:统计class loader行为信息
    -compile:统计编译行为信息
    -gc:统计jdk gc时heap信息
    -gccapacity:统计不同的generations(不知道怎么翻译好,包括新生区,老年区,permanent区)相应的heap容量情况
    -gccause:统计gc的情况,(同-gcutil)和引起gc的事件
    -gcnew:统计gc时,新生代的情况
    -gcnewcapacity:统计gc时,新生代heap容量
    -gcold:统计gc时,老年区的情况
    -gcoldcapacity:统计gc时,老年区heap容量
    -gcpermcapacity:统计gc时,permanent区heap容量
    -gcutil:统计gc时,heap情况
    -printcompilation:不知道干什么的,一直没用过。

    jstat也提供远程能力,

    a)使用 jps 查看远端机器有哪些 JVM 进程在使用当中,命令如下:

    jps 172.25.1.24 // 远端机器的 IP 地址或名称

    屏幕输入如下:

    13686 Jstatd

    14115 XXXJavaServer

    15117 Jserver

    b)从上面可以看到远端机器的 Jstatd 进程已经启动起来了。我们就可以使用 jstat 对相关进程的具体情况进行查看。

    Jstat 命令用法如下:

    jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]

    解释如下:

    Option 包括以下选项:

    -class

    -compiler

    -gc

    -gccapacity

    -gccause

    -gcnew

    -gcnewcapacity

    -gcold

    -gcoldcapacity

    -gcpermcapacity

    -gcutil

    -printcompilation

    Vmid 就是 jps 查看到的进程 id ,如上 Jserver 的进程 id 是 15117 。

    Interval 是时间间隔,单位为毫秒, 1000 就是一秒。

    Count 就是需要查看的次数。

    例子假设我们需要查看 172.25.1.24 机器 vmid 为 15117 的 gc 的情况,可以输入下面的命令:

    jstat -gc 15117@172.25.1.24 1000 3

    然后你能看到四行信息(一行为 title ,剩下的就是你要的信息了),仔细看看就可以发现很多信息的了。

    c) jstat还有一个可视化的监控包, 叫做jvmstat ,可以从sun的主页下载到。下载好了后,解压到任意目录。

    执行 visualgc <pid> ,其实命令跟jstat很像,也可以监控到远程主机。然后就可以看到可视化的监控窗口。还挺酷的。

    一般比较常用的几个参数是:
    jstat -class 2083 1000 10 (每隔1秒监控一次,一共做10次)
    输出内容含义如下:

    Loaded Number of classes loaded.
    Bytes Number of Kbytes loaded.
    Unloaded Number of classes unloaded.
    Bytes Number of Kbytes unloaded.
    Time Time spent performing class load and unload operations.

    jstat -gc 2083 2000 20(每隔2秒监控一次,共做10)
    输出内容含义如下:

    S0C Current survivor space 0 capacity (KB).
    EC Current eden space capacity (KB).
    EU Eden space utilization (KB).
    OC Current old space capacity (KB).
    OU Old space utilization (KB).
    PC Current permanent space capacity (KB).
    PU Permanent space utilization (KB).
    YGC Number of young generation GC Events.
    YGCT Young generation garbage collection time.
    FGC Number of full GC events.
    FGCT Full garbage collection time.
    GCT Total garbage collection time.

    输出内容:

    图形:

    visualvm

    http://www.iteye.com/topic/516447

    如果是本地监控,则可以直接在本地的 窗口中看到java应用程序。双击点开即可打开监控窗口。

    我们再看一下图1,左边的窗口中,第二个节点—Remote,它可以用来操作远程机器。远程机器需要启动一个daemon:jstatd

    1、远程机器启动jstatd

    1.1、        首先需要准备一个java.policy文件,保存到如/home/admin/jstatd.java.policy

    grant codebase “file:$

    Unknown macro: {java.home}/../lib/tools.jar” {
       permission java.security.AllPermission;
    }; |
    1.2、        启动jstatd

    jstatd -J-Djava.security.policy=/home/admin/jstatd.java.policy -J-Djava.rmi.server.logCalls=true

    1.3、        同时需要执行一个命令看看(linux需要)

    Hostname –i
    如果显示是127.0.0.1,则需要修改/etc/hosts文件,去掉对本机名的配置,让本机名解析到它的IP地址,如10.20.131.214

    2、连接远程机器

    (图8)

    3、点击OK,看到会连接到远程机器,并显示出它下面的java进程。



    jconsole

    http://www.blogjava.net/beansoft/archive/2006/12/13/87494.html

    监控本地应用

    首先就是启动您要监控的应用, 例如我用 JDK 1.6 来启动了 Tomcat, 或者 Eclipse 也可以, 可以在任务管理器(Ctrl+Alt+Del可以调出来, 或者在任务栏点击右键)里看到进程ID, 例如我这里是 6132.

    接着在 JDK 安装目录中(<JDK_HOME>/bin/jconsole.exe)启动 jconsole.exe (双击或者在 cmd 里面敲入 jconsole), 主界面会提示您建立一个新连接:

    http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/201371a3d235_CCDC/image06.png

    可以看到进程ID, 选择它, 然后点击”连接”. 这些 ID 必须都是用 JDK 1.6 的 java.exe 启动的, 否则在列表里看不到.

    http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/201371a3d235_CCDC/image09.png

    JConsle 能监控内存,线程,类的数目和CPU然后点击各个 Tab 可以看到详细的输出, 详细的输出包括:
    内存: 堆/非堆, 峰值, 内存的各个部分, 例如 Perm, Eden 等的大小曲线图.
    线程: 峰值, 所有线程的列表, 堆栈跟踪(哪个对象中的线程)等. 还可以强制执行GC.
    类: 峰值, 类总数曲线图.
    MBean: 一些 JVM 参数的详细 MBean 信息.

    监控远程进程

    首先需要在运行的应用上启用远程管理, 参数如下(简单期间就不加用户验证了):
    java -Dcom.sun.management.jmxremote.port=1090 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar ../demo/jfc/Java2D/Java2Demo.jar

    然后连接的时候选择远程进程, 地址输入:

    localhost:1090

    即可.当然在别的电脑上(一般是局域网)可以输入那个电脑的IP.

    综述: 使用 JConsole 可以简单的监控 Server 状态, 但是本身要占一定的资源, 不过 JVM 自带的监控, 理论上讲应该是占资源很小很小的,  可以用它来方便的了解 Web 服务器应用进程的状态. 如果要调优应用, 还是使用 JProfiler 等工具更好一些, 当然它们占的资源也更大.



    SUN官方说明:

    jvisualvm: http://java.sun.com/javase/6/docs/technotes/tools/share/jvisualvm.html

    jps:http://java.sun.com/javase/6/docs/technotes/tools/share/jps.html
    jstat:http://java.sun.com/javase/6/docs/technotes/tools/share/jstat.html
    jmap:http://java.sun.com/javase/6/docs/technotes/tools/share/jmap.html
    jconsole:http://java.sun.com/javase/6/docs/technotes/tools/share/jconsole.html\\


    jstack — 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到 当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。目前只有在Solaris和Linux的JDK版本里面才有。

    jconsole — jconsole是基于Java Management Extensions (JMX)的实时图形化监测工具,这个工具利用了内建到JVM里面的JMX指令来提供实时的性能和资源的监控,包括了Java 程序的内存使用,Heap size, 线程的状态,类的分配状态和空间使用等等。

    jinfo — jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息,目前只有在Solaris和Linux的JDK版本里面才有。

    jmap — jmap 可以从core文件或进程中获得内存的具体匹配情况,包括Heap size, Perm size等等,目前只有在Solaris和Linux的JDK版本里面才有。

    jdb — jdb 用来对core文件和正在运行的Java进程进行实时地调试,里面包含了丰富的命令帮助您进行调试,它的功能和Sun studio里面所带的dbx非常相似,但 jdb是专门用来针对Java应用程序的。

    jstat — jstat利用了JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控等等。

    jps — jps是用来查看JVM里面所有进程的具体状态, 包括进程ID,进程启动的路径等等。

    jstatd 
    启动jvm监控服务。它是一个基于rmi的应用,向远程机器提供本机jvm应用程序的信息。默认端口1099。
    实例:jstatd -J-Djava.security.policy=my.policy

    my.policy文件需要自己建立,内如如下:
    grant codebase “file:$JAVA_HOME/lib/tools.jar” {
    permission java.security.AllPermission;
    };
    这是安全策略文件,因为jdk对jvm做了jaas的安全检测,所以我们必须设置一些策略,使得jstatd被允许作网络操作

    上面的操作没有通过,出现:

    Could not create remote object
    access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)
    java.security.AccessControlException: access denied (java.util.PropertyPermission java.rmi.server.ignoreSubClasses write)
    at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
    at java.security.AccessController.checkPermission(AccessController.java:546)
    at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
    at java.lang.System.setProperty(System.java:727)
    at sun.tools.jstatd.Jstatd.main(Jstatd.java:122)

    create in your usr/java/bin the jstatd.all.policy file, with the content must be grant codebase “file:$

    /../lib/tools.jar”

    Unknown macro: {   permission java.security.AllPermission;   }

    ;  jps 
    列出所有的jvm实例
    实例:
    jps
    列出本机所有的jvm实例

    jps 192.168.0.77
    列出远程服务器192.168.0.77机器所有的jvm实例,采用rmi协议,默认连接端口为1099
    (前提是远程服务器提供jstatd服务)

    输出内容如下:
    jones@jones:~/data/ebook/java/j2se/jdk_gc$ jps
    6286 Jps
    6174  Jstat

    jconsole 
    一个图形化界面,可以观察到java进程的gc,class,内存等信息。虽然比较直观,但是个人还是比较倾向于使用jstat命令(在最后一部分会对jstat作详细的介绍)。

    jinfo (linux下特有)
    观察运行中的java程序的运行环境参数:参数包括Java System属性和JVM命令行参数
    实例:jinfo 2083
    其中2083就是java进程id号,可以用jps得到这个id号。
    输出内容太多了,不在这里一一列举,大家可以自己尝试这个命令。

    jstack (linux下特有)
    可以观察到jvm中当前所有线程的运行情况和线程当前状态
    jstack 2083
    输出内容如下:

    jmap (linux下特有,也是很常用的一个命令)
    观察运行中的jvm物理内存的占用情况。
    参数如下:-heap :打印jvm heap的情况
    -histo: 打印jvm heap的直方图。其输出信息包括类名,对象数量,对象占用大小。
    -histo:live : 同上,但是只答应存活对象的情况
    -permstat: 打印permanent generation heap情况

    命令使用:
    jmap -heap 2083
    可以观察到New Generation(Eden Space,From Space,To Space),tenured generation,Perm Generation的内存使用情况
    输出内容:

    jmap -histo 2083 | jmap -histo:live 2083
    可以观察heap中所有对象的情况(heap中所有生存的对象的情况)。包括对象数量和所占空间大小。
    输出内容:

    写个脚本,可以很快把占用heap最大的对象找出来,对付内存泄漏特别有效。

    jstat 
    最后要重点介绍下这个命令。
    这是jdk命令中比较重要,也是相当实用的一个命令,可以观察到classloader,compiler,gc相关信息
    具体参数如下:
    -class:统计class loader行为信息
    -compile:统计编译行为信息
    -gc:统计jdk gc时heap信息
    -gccapacity:统计不同的generations(不知道怎么翻译好,包括新生区,老年区,permanent区)相应的heap容量情况
    -gccause:统计gc的情况,(同-gcutil)和引起gc的事件
    -gcnew:统计gc时,新生代的情况
    -gcnewcapacity:统计gc时,新生代heap容量
    -gcold:统计gc时,老年区的情况
    -gcoldcapacity:统计gc时,老年区heap容量
    -gcpermcapacity:统计gc时,permanent区heap容量
    -gcutil:统计gc时,heap情况
    -printcompilation:不知道干什么的,一直没用过。

    一般比较常用的几个参数是:
    jstat -class 2083 1000 10 (每隔1秒监控一次,一共做10次)
    输出内容含义如下:

    Loaded Number of classes loaded.
    Bytes Number of Kbytes loaded.
    Unloaded Number of classes unloaded.
    Bytes Number of Kbytes unloaded.
    Time Time spent performing class load and unload operations.

    jstat -gc 2083 2000 20(每隔2秒监控一次,共做10)
    输出内容含义如下:

    S0C Current survivor space 0 capacity (KB).
    EC Current eden space capacity (KB).
    EU Eden space utilization (KB).
    OC Current old space capacity (KB).
    OU Old space utilization (KB).
    PC Current permanent space capacity (KB).
    PU Permanent space utilization (KB).
    YGC Number of young generation GC Events.
    YGCT Young generation garbage collection time.
    FGC Number of full GC events.
    FGCT Full garbage collection time.
    GCT Total garbage collection time.

    输出内容:

    JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jstat

  • JVM 性能调优工具学习

    一、What

    JDK 本身提供了很多很方便的 JVM 性能调优工具,如 VisualVM、Jconsole、jps、jstack、jmap、jhat、Jstat、jprof等。

    可以帮我们解决下列问题:

    • OutofMemory 内存不足
    • 内存泄漏
    • 线程死锁
    • 锁争用(Lock Contention)
    • java 进程消耗 CPU 过高

    1.   Jstack(查看线程)

    1.1 作用:

    jstack主要用来抓取 Java JVM 中 某个进程 某一时刻 线程堆栈信息。其实就是抓取 thread dump 文件。

        thread dump 诊断 java 应用问题的工具,可以显示 Java JVM中的所有线程在某一个时间点的快照文件

    1.2 内容:

    线程标识,运行状态,调用的堆栈、调用的堆栈包含完整的类名、所执行的方法、还有源代码的行数。

    Sun JVM 常见线程状态:

    Runnable(R): 当前可以运行的线程。

    Waiting on monitor(CW): 线程主动 wait

    Waiting for monitor entry(MW):线程等锁

    JVM 中的 thin lock, fat lock, spin lock, tasuki lock:

    1.3 Demo:

    “process reaper” daemon prio=10 tid=0x00007f3d7014b800 nid=0x8b80a waiting on condition [0x00007f3dc68f0000]

    java.lang.Thread.State: TIMED_WAITING (parking)

    at sun.misc.Unsafe.park(Native Method)

    – parking to wait for  <0x00000000f007cfb0> (a java.util.concurrent.SynchronousQueue$TransferStack)

    at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:226)

    at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:460)

    at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:359)

    at java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:942)

    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1068)

    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)

    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)

    at java.lang.Thread.run(Thread.java:745)

     

    process reaper: 线程名称

    daemon: 线程类型,守护线程

    prio: 线程优先级

    tid: thread id,JVM 中线程唯一标识

    nid: native thread id,系统中线程唯一标识

    waiting on condition: 线程状态

    at…: 堆栈信息

     

    Jstack 的目的主要是抓取 thread dump 文件然后使用工具进行分析。

    1.4 常见线程:

        Attach Listener负责接收外部命令,用户第一次执行 JVM 命令的时候得到启动。

        Signal DispatherAttach Listener 接收到外部命令交给 Signal Dispather 进行分发到各个不同的模块处理,并且返回处理结果。

        CompilerThread0实时编译卸载 class,JVM 会启动多个线程来处理这部分工作,线程名称后面的数字也会累加。

        Concurrent Mark-Sweep GC Thread并发标记清除垃圾回收器线程(CMC GC),该线程主要针对老年代垃圾回收

        Finalizer线程:垃圾收集前,调用对象的finalize()方法

     

    • 只有当开始一轮垃圾收集时,才会开始调用finalize()方法;因此并不是所有对象的finalize()方法都会被执行
    • 该线程也是daemon线程,因此如果虚拟机中没有其他非daemon线程,不管该线程有没有执行完finalize()方法,JVM也会退出
    • JVM在垃圾收集时会将失去引用的对象包装成Finalizer对象(Reference的实现),并放入ReferenceQueue,由Finalizer线程来处理;最后将该Finalizer对象的引用置为null,由垃圾收集器来回收
    • JVM为什么要单独用一个线程来执行finalize()方法呢?如果JVM的垃圾收集线程自己来做,很有可能由于在finalize()方法中误操作导致GC线程停止或不可控,这对GC线程来说是一种灾难

    2.     Jstat(查看性能)

    2.1 作用:

    可以观察到classloader,compiler,gc相关信息。可以实时监控资源和性能 。

    2.2 命令选项:

    -class统计class loader行为信息
    -compile统计编译行为信息
    -gc统计jdk gc时heap信息
    -gccapacity: 统计不同的generations(不知道怎么翻译好,包括新生区,老年区,permanent区)相应的heap容量情况
    -gccause统计gc的情况,(同-gcutil)和引起gc的事件
    -gcnew统计gc时,新生代的情况
    -gcnewcapacity统计gc时,新生代heap容量
    -gcold统计gc时,老年区的情况
    -gcoldcapacity统计gc时,老年区heap容量
    -gcpermcapacity统计gc时,permanent区heap容量
    -gcutil统计gc时,heap情况

    2.3 参数内容

    S0  — Heap上的 Survivor space 0 区已使用空间的百分比
    S0C:S0当前容量的大小
    S0U:S0已经使用的大小
    S1  — Heap上的 Survivor space 1 区已使用空间的百分比
    S1C:S1当前容量的大小
    S1U:S1已经使用的大小
    E   — Heap上的 Eden space 区已使用空间的百分比
    EC:Eden space当前容量的大小
    EU:Eden space已经使用的大小
    O   — Heap上的 Old space 区已使用空间的百分比
    OC:Old space当前容量的大小
    OU:Old space已经使用的大小
    P   — Perm space 区已使用空间的百分比
    OC:Perm space当前容量的大小
    OU:Perm space已经使用的大小
    YGC — 从应用程序启动到采样时发生 Young GC 的次数
    YGCT– 从应用程序启动到采样时 Young GC 所用的时间(单位秒)
    FGC — 从应用程序启动到采样时发生 Full GC 的次数
    FGCT– 从应用程序启动到采样时 Full GC 所用的时间(单位秒)
    GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒),它的值等于YGC+FGC

    3.     Jmap(查看内存)

    3.1 作用:

    jmap 用来查看堆内存使用状况,一般结合 jhat 使用

    3.2 命令选项

    -heap打印 heap 的概要信息,GC 使用的算法,heap 的配置以及 wise heap 的使用情况。

    -histo打印每个 class 的实例数目,内存占用,类全名信息,

    -permstat打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来.

    二、Why

    有时候内存泄漏,内存溢出,或者死锁等现象出现的时候仅仅通过应用程序的日志信息是很难定位问题的,很多时候这种情况出现的时候我们的解决方案都是重启服务器,但是这种方式并没有从根本上解决问题,程序运行一段时间还是会出现上述现象。

    所以为了从根本上解决这些问题,我们首先要定位问题,知道问题发生的原因,因为 Java 应用程序都是运行在 JVM 上的,所以了解 JVM 的概念和原理是我们发现问题的第一步。

    JVM 中为我们提供了一些内置的工具可以用于抓取 JVM 的状态信息,比如使用 Jstack 可以抓取当前进程的堆栈信息,分析后判断是否存在死锁问题,使用 Jmap 可以抓取堆内存信息,分析后可以发现各种内存泄漏,内存溢出的原因,使用 Jstat 可以查看系统的性能等。

    三、How

    1. Jstack

    操作流程:

    第一步:抓取堆栈信息写入 a.txt

    jstack –l <pid>

     

    第二步:使用工具分析堆栈信息

    2. Jstat

    抓取信息:

    # jstat -gc 30077 100 5

    3. Jmap

    使用 IBM 的HeapAnalyzer 分析堆内存信息。

    第一步:抓取数据

     

    第二步:使用工具分析:HeapAnalyzer

     

    四、参考资料

    【1】性能分析之– JAVA Thread Dump 分析综述

    http://blog.csdn.net/rachel_luo/article/details/8920596

    【2】jstack(查看线程)、jmap(查看内存)和jstat(性能分析)命令

    http://guafei.iteye.com/blog/1815222

    【3】三个实例演示 Java Thread Dump 日志分析

    http://www.cnblogs.com/zhengyun_ustc/archive/2013/01/06/dumpanalysis.html

    【4】关于JVM的Thin Lock, Fat Lock, SPIN Lock与Tasuki Lock

    http://www.blogjava.net/security/archive/2009/02/16/jvm_thin-lock_fat-lock__spin-lock_tasuki-lock.html

    【5】JVM性能调优监控工具

    https://my.oschina.net/feichexia/blog/196575

  • 内存jvm参数调整总结

    对tomcat 7.0 下堆内存告警的情况进行了总结,线上jdk1.6使用的GC策略为:-XX:+UseParallelGC ,即新生代为并行GC年老代为串行GC,jdk1.7默认GC方式为-XX:+UseParallelOldGC ,即新生代和年老代均为并行GC。修改方式为,修改jdk1.7的GC策略为-XX:+UseConcMarkSweepGC (并发GC策略,仅标记阶段会暂停工作线程,响应优先,会较多较快的执行FullGc)。

    监控报表的应用等也都遇到了堆内存超过80%的问题,其中一些应用是jdk1.6,也有jdk1.7。参照调整

     

    原选项(或默认选项)

    -XX:+UseParallelGC

     

    修改为:

    -XX:+UseConcMarkSweepGC

     

    后,观察发现,young gc的次数明显增多,Full gc没有明显增长,堆内存随着时间推移仍然缓慢增长,待增长到一定时间,仍然有堆内存超过80%的告警。告警之后,Full gc之后,告警消失。于是分析,应该是年轻代内存上限不够,另外,能否通过适当增加Full gc的次数,对年老代进行及时回收。通过参考相关文档,旧生代并发回收的触发时机为:

    1、当旧生代空间使用到一定比率时触发;

    JDK V 1.6中默认为92%,可通过PrintCMSInitiationStatistics(此参数在V 1.5中不能用)来查看这个值到底是多少;

    可通过CMSInitiatingOccupancyFraction来强制指定,默认值并不是赋值在了这个值上,是根据如下公式计算出来的:

    ((100 – MinHeapFreeRatio) +(double)(CMSTriggerRatio * MinHeapFreeRatio) / 100.0)/ 100.0;

    MinHeapFreeRatio默认值: 40   CMSTriggerRatio默认值: 80

     

    2、当perm gen采用CMS收集且空间使用到一定比率时触发;

    perm gen采用CMS收集需设置:-XX:+CMSClassUnloadingEnabled

    JDK V 1.6中默认为92%;

    可通过CMSInitiatingPermOccupancyFraction来强制指定,同样,它是根据如下公式计算出来的:

    ((100 – MinHeapFreeRatio) +(double)(CMSTriggerPermRatio* MinHeapFreeRatio) / 100.0)/ 100.0;

    MinHeapFreeRatio默认值: 40    CMSTriggerPermRatio默认值: 80

     

    3、Hotspot根据成本计算决定是否需要执行CMS GC;

    可通过-XX:+UseCMSInitiatingOccupancyOnly来去掉这个动态执行的策略。

    4、外部调用了System.gc,且设置了ExplicitGCInvokesConcurrent;

    需要注意,在JDK 6中,在这种情况下如应用同时使用了NIO,可能会出现bug

     

    另外有两个重要的表格参考:

    新生代GC方式 旧生代和持久代GC方式
    -XX:+UseSerialGC 串行GC 串行GC
    -XX:+UseParallelGC PS GC 并行MSC GC
    -XX:+UseConcMarkSweepGC ParNew GC 并发GC

    当出现concurrent Mode

    failure时采用串行GC

    -XX:+UseParNewGC 并行GC 串行GC
    -XX:+UseParallelOldGC PS GC 并行Compacting GC
    -XX:+UseConcMarkSweepGC

    -XX:-UseParNewGC

    串行GC 并发GC

    当出现Concurrent Mode

    failure或promotion failed

    时则采用串行GC

    不支持的组合方式 1、-XX:+UseParNewGC –XX:+UseParallelOldGC

    2、-XX:+UseParNewGC –XX:+UseSerialGC

     

     

    GC方式 常用参数(-Xms –Xmx –Xmn –XX:PermSize –XX:MaxPermSize
    新生代可用GC 串行GC -XX:SurvivorRatio,默认为8,代表eden:survivor;

    -XX:MaxTenuringThreshold,默认为15,代表对象在新生代经历多少次minor gc后

    才晋升到旧生代;

    PS GC -XX:InitialSurvivorRatio,默认为8,代表new gen:survivor;

    -XX:SurvivorRatio,默认值对于PS GC无效,但仍然可设置,代表eden:survivor;

    -XX:-UseAdaptiveSizePolicy,不允许PS GC动态调整eden、s0、s1的大小,

    此时-XX:MaxTenuringThreshold也可使用;

    -XX:ParallelGCThreads,设置并行GC的线程数。

    ParNew GC 同串行。
    旧生代和持久代可用GC 串行GC 无特殊参数。
    并行GC

    (包括MSC、

    Compacting)

    -XX:ParallelGCThreads,设置并行GC的线程数。

    -XX:+ScavengeBeforeFullGC,Full GC前触发Minor GC

    并发GC -XX:ParallelCMSThreads,设置并发CMS GC时的线程数;

    -XX:CMSInitiatingOccupancyFraction,当旧生代使用比率占到多少百分比时触发CMS GC;

    -XX:+UseCMSInitiatingOccupancyOnly,默认为false,代表允许hotspot根据成本来决定

    什么时候执行CMS GC;

    -XX:+UseCMSCompactAtFullCollection,当Full GC时执行压缩;

    -XX:CMSMaxAbortablePrecleanTime=5000,设置preclean步骤的超时时间,单位为毫秒;

    -XX:+CMSClassUnloadingEnabled,Perm Gen采用CMS GC回收。

     

    经过以上分析,调整内存参数为:

     

    -Xms4096m -Xmx4096m -XX:MaxPermSize=512m -XX:+UseConcMarkSweepGC -Xmn2048M -XX:+UseCMSInitiatingOccupancyOnly -XX:+CMSClassUnloadingEnabled

     

    具体含义如下:

    XmsXmx就不用说了,

    -XX:MaxPermSize最大持久代内存512M

    -XX:+UseConcMarkSweepGC 使用年轻代和年老代都并行gc的方式,并且gc的时间短,old gc的次数取决于stop the world(中断响应)的次数,尽量减少对应用响应的影响。

    -Xmn2048M:设置新生代内存的上限大小为2g,这是为了减少young gc的次数,因为默认内存分配是会从新生代内存中分配的。

    -XX:+UseCMSInitiatingOccupancyOnly: 不加这个选项的话,根据成本计算决定是否需要执行CMS gc,加上这个选项,当旧生代空间使用率达到92%时会无条件执行Full GC

    -XX:+CMSClassUnloadingEnabled :CMS收集器默认不会对永久代进行垃圾回收。如果希望对永久代进行垃圾回收,需要设置此选项。

     

    其实还有两个选项可以考虑:

    CMSInitiatingOccupancyFraction: 当旧生代空间使用到一定比率时, 强制执行旧生代的Full GC。默认为92%。这个参数如果设置为50左右的话,Full GC的次数会非常频繁。可能会对应用的性能造成一定影响。

    CMSInitiatingPermOccupancyFraction: 当持久代里的使用比例达到一定比率时,进行持久代内存的回收,默认为92%。如果调低的话,也会明显增多持久代gc的次数。

    但这个选项也可能对应用的性能造成影响,所以使用需要谨慎。

     

     

     

    调整前的堆内存一天内变化趋势,可以看到虽然在调整,但是整体堆内存使用仍然呈增长态势,可以分析是Full GC的次数不够。

Copyright © 2014-2025 奋奋的愤愤 | 京ICP备14029030号-1