1. Disruptor 等待策略引发的 CPU 负载异常问题

    2020-07-14 Tue
    By xiayf

    背景

    工作中,我负责的系统是一个数据流处理服务 - 以流水线(pipeline)的形式分多级异步处理:

    其中的 队列 实际使用的是 Disruptor,多生产者单消费者模式:

    ThreadFactory factory = new ThreadFactoryBuilder().setNameFormat(name).setDaemon(true).build();
    Disruptor<Event<T>>  disruptor = new Disruptor<>(Event<T>::new, bufferSize, factory, ProducerType.MULTI, new SleepingWaitStrategy());
    disruptor.handleEventsWith((Event<T> event, long sequence, boolean endOfBatch) -> {
        consumer.accept(event.value, endOfBatch);
        event …
  2. 如何剖析 JVM 应用(译)

    2020-07-13 Mon
    By xiayf

    原文链接:How to profile JVM applications

    Hi 大家好。工具团队(tooling team)近期的一个关注点是改进 sbt 贡献流程( improvement of the contribution process to sbt)。我们一直在思考的另一个事情是 sbt 的性能。为一举解决这两件事情,我调研了 Jason Zaugg、Johannes Rudolph 这些人如何剖析 JVM 应用,这篇文章即是调研结果。

    这里论述的技术应该可以应用于Java 和 Scala,也基本与你使用的工具无关。

    火焰图(使用 async-profiler 生成)

    剖析 JVM 应用的方式有多种,但新晋热门是Netflix 高级性能架构师(Senior Performance Architect …

  3. 博客构建环境准备

    2020-06-14 Sun
    By xiayf

    好记性不如烂笔头。

    1、Python 虚拟环境

    virtualenv -p python3 ~/.py3
    source ~/.py3/bin/activate
    

    2、安装 Python 依赖包

    pip install pelican[Markdown]   # 可能需要先安装 pip:easy_install pip
    

    3、安装主题包

    git clone https://github.com/youngsterxyf/my-pelican-themes.git ~/github/youngsterxyf/my-pelican-themes
    pelican-themes -i ~/github/youngsterxyf/my-pelican-themes/my-gum
    

    4、构建

    make html
    

    另,更新艺术字体或字集:

    (1 …

  4. 读文笔记:Kafka 官方设计文档

    2019-10-13 Sun
    By xiayf

    原文:http://kafka.apache.org/documentation/#design

    数据持久化

    不用惧怕文件系统

    磁盘的读写速度,取决于如何读写。对于线性读写方式,操作系统做了充分的优化:提前读 - 预取若干数据块,滞后写 - 将小的逻辑写操作合并成一个大的物理写操作。

    研究表明:顺序读写磁盘(sequential disk access)的速度有些时候比随机访问内存还要快

    现代操作系统激进地尽可能将空闲内存用作磁盘缓存。所有磁盘读写都经过操作系统提供的统一缓存。这个特性没法轻易关闭,除非直接 I/O (direct I/O),因此,如果程序在用户进程中进行数据缓存,缓存的数据通常也是和操作系统页缓存重复的,缓存两遍,没啥意义,也浪费内存。

    而且,Kafka 是构建在 JVM 之上的,了解 Java 内存使用方式的人应该都知道:

    1. 对象的内存开销非常高,通常是实际数据大小的2倍(甚至更多 …
  5. 读文笔记:Photon - Fault-tolerant and Scalable Joining of Continuous Data Streams

    2019-10-10 Thu
    By xiayf

    原文:Photon: Fault-tolerant and Scalable Joining of Continuous Data Streams

    Photon 是谷歌广告系统中用于 join 广告曝光日志流和点击日志流的一套系统。

    数据流 join 为什么没用 flink 这类通用的流式处理框架?

    数据流 join,特别是广告数据流 join,技术上难在哪里?

    任一条流都可能乱序或延迟,广告点击涉及计费的问题,计费不能多算广告主的钱,也要尽可能避免漏计费,降低广告收入损失。


    该系统在谷歌生产环境中每分钟处理百万级的事件,端到端延迟小于 10 秒(注:对于广告实时竞价的广告主而言,这个延迟的长短很重要)。

    广告曝光、点击整体流程为:

    1. 用户搜索某个关键词时,谷歌的服务器会返回广告和搜索结果。广告服务器会将广告 query 和结果数据作为日志发送到多个日志数据中心(multiple logs-datacenters),最终持久化存储在 GFS 上。每次 query …
    标签: 论文 笔记
  6. 读文笔记:日志 - 每个软件工程师都应该了解的实时数据统一抽象

    2019-10-10 Thu
    By xiayf

    原文:The Log: What every software engineer should know about real-time data's unifying abstraction

    一句话概括,这篇文章细说了 Kafka 的本质原理、解决的问题、适用性等。

    Kafka 本质上是提供日志数据流。

    日志是客观世界的事件记录。

    A log is perhaps the simplest possible storage abstraction. It is an append-only, totally-ordered sequence of records ordered by time.

    日志数据的特点是:只增不改,自带时间戳,数据存储的先后顺序即(大致)是实际发生的时间先后顺序。

    数据库可以基于日志来还原历史操作行为 …

    标签: 论文 笔记
  7. Lucene 查询解析器语法(译)

    2019-09-04 Wed
    By xiayf

    原文:Query Parser Syntax

    概览

    Lucene 除了提供 API 方便开发者创建查询请求,还通过一个查询解析器(一个词法分析器,使用 JavaCC 将一个字符串翻译成一个 Lucene 查询)提供一种功能丰富的查询语言。

    一般来说,查询解析器支持的语法在不同发布版本之间可能会有变化。当前这个文档页面描述的是当前这个发布版本的语法。如果你正在使用一个不同版本的 Lucene,请参考该版本自带的 docs/queryparsersyntax.html 文档。

    在选择使用这个查询解析器之前,请考虑以下 3 点:

    1. 如果你准备以编程的方式生成一个查询字符串,然后使用查询解析器来解析它。那么,你应该认真考虑一下是否应该直接使用查询 API 来构建查询。换句话说,查询解析器专门用于人类输入的文本,而不是程序生成的文本。
    2. 不可分词(untokenized)的域(译者注:抱歉,此处没太理解)最好直接添加到查询中,而不是通过查询解析器来解析。如果一个域的值是通过应用自动生成的,那么应该为这个域自动生成查询子句 …
  8. 一个 Python 小项目的小结

    2019-08-14 Wed
    By xiayf

    前段时间临时接手一个 Python 小项目,这个项目实现的类似一个管控平台,其中核心功能是为算法同学提供机器学习模型训练任务的全流程管理,平台后端基于 Flask 框架实现,前端基于 Ant Design Pro 实现。

    代码稍微有些乱,所以做了部分代码的重构,在此做点经验小结。

    1、并行化或异步化

    部分请求处理逻辑,由于比较耗时,故使用线程池来加速,或者使用独立线程异步处理,或者先存储一个中间状态,由后台定时任务来完成实际的处理工作。对于异步处理结果,前端通过轮询来获取。

    线程池的使用,主要使用 map 方法:

    from multiprocessing.dummy import Pool
    
    input_list = [...]
    pool: Pool = Pool(len(input_list))
    pool.map(func, input_list)
    pool.close()
    pool.join()
    

    独立线程异步处理 …

    标签: 总结 Python

Page 1 / 18