浅谈动态追踪技术

2023-05-16

本文主要介绍了动态追踪技术,并举例说明动态追踪技术的应用。

身为一个SRE,工作中经常会遇到各种奇奇怪怪的服务异常问题。这些问题在staging(测试环境)没有发现,但放到真实的生产环境就会碰到,最关键的是难以复现,某些问题可能是几个月才会复现。

初次碰到可能会手忙脚乱,暴力的解决手段是将机器拉下线,然后开始专家会诊,但是脱离了线上真实环境,没有线上真实流量,某些问题可能不好复现了,这种方式还不是特别适合。

 

如何找到病因

大部分情况,其实我们已经可以通过top,pidstat等命令定位到具体是哪一个服务出的问题。当然重启服务可以解决60%以上的服务异常问题,但是重启后会丢失现场。

重启一时爽,一直重启就不爽了。还是需要定位到具体的问题。我还是希望知道底病根在哪,最好直接告诉我哪个具体函数,哪条语句导致的问题或者bug。最差也得知道是大致什么节点的什么类型故障

很多人可能会想到GDB。虽然这些工具很伟大,但是这应该不适合我们sre在已经服务已经发病的情况下使用,因为线上的服务不能被中止。GDB在调试过程中设置断点会发出SIGSTOP信号,这会让被调试进程进入T (TASK_STOPPED or TASK_TRACED)暂停状态或跟踪状态。同时 GDB 所基于的 ptrace 这种很古老的系统调用,其中的坑和问题也非常多。

比如 ptrace 需要改变目标调试进程的父亲,还不允许多个调试者同时分析同一个进程,而且不太熟悉GDB的人可能会把程序调试挂了,这种交互式的追踪过程通常不考虑生产安全性,也不在乎性能损耗。另外提一下,strace也是基于ptrace的,所以strace也是对性能不友好的。

那么就要提到动态追踪技术了,动态追踪技术通常通过探针这样的机制发起查询。动态追踪一般来说是不需要应用目标来配合的,随时随地,按需采集,而且它非常大的优势为性能消耗极小(通常5%或者更低的水平)。

动态追踪

动态追踪的工具很多,systemtap,perf,ftrace,sysdig,dtrace,eBPF等,由于我们的线上服务器是Linux系统,且内核版本没有那么激进的使用最新的版本,所以我还是比较倾向于使用perf或者systemtap。就我个人而言,perf无疑是我的最爱了。

动态追踪的事件源根据事件类型不同,主要分为三类。静态探针, 动态探针以及硬件事件。

静态探针:事先在代码中定义好的一类,已经编译进应用程序或内核中的探针。常见的有 tracepoints(这是散落在内核源代码中的一些hook,使能后一旦特定的代码被运行到时就会被触发)还有USDT探针。

动态探针:事先没有在代码中定义,但是可以在运行时动态加载,比如函数返回值等。常见的有uprobes(跟踪用户态函数)和kprobes(跟踪内核态函数)。

硬件事件:一般由PMC产生,比如intel的CPU,一般会内置统计性能的寄存器(Hardware Prefirmance Counter)。

想要查看可触发的采样事件可以通过 perf list 去展示

$ perf list

List of pre-defined events (to be used in -e):

branch-instructions OR cpu/branch-instructions/ [Kernel PMU event]
branch-misses OR cpu/branch-misses/ [Kernel PMU event]

... ...

可以看下perf是支持很多事件的(注:由于线上服务器内核版本不是最新的,所以这里看到的有些少)

$ perf list | wc -l
1196

其主要分这几大类(不同的版本可能看到的不一样),HardWare Event,SoftWare Event,Kernel Tracepoint Event,User Statically-Defined Tracing (USDT),Dynamic Tracing。

HardWare Event 

就是上面提到的PMC,通过这些内容可以获取到cpu周期,2级缓存命中等事件,其实这些有些太过底层,在实际业务中并用不到这些的。

SoftWare Event

软件事件是区别硬件事件的,比如缺页,上下文切换等。

Kernel Tracepoint Event

内核追踪点事件一般就是我们能想到的一些内核事件。Linux内核中定义了大量的跟踪点,在代码层面就被编译进内核,如TCP,文件系统,磁盘I/O,系统调用,随机数产生等等了。

User Statically-Defined Tracing (USDT)

与内核追踪点事件类似,只不过是用户级的,需要在源代码中插入DTRACE_PROBE()代码,其实不少软件都已经实现了,如Oracle。且一般在编译的时候使用 ./configure --with-dtrace。如下所示是加上探测器的一段代码,在<sys/sdt.h>中加入的了DTRACE_PROBE() 宏的引用

#include <sys/sdt.h>
...

void
main_look(void)
{
    ...
    query = wait_for_new_query();
    DTRACE_PROBE2(myserv, query__receive, query->clientname, query->msg);
    process_query(query)
    ...
}

Dynamic Tracing

动态追踪。当内核编译时开启CONFIG_KPROBES和CONFIG_UPROBES就可以使用动态的跟踪。有了这些,我们就可以通过添加探针,来追踪一个应用程序的内核调用,如打开文件,发送tcp报文。

$ perf probe --add 'do_sys_open filename:string'$ perf record -e probe:do_sys_open -aR -p  ${Service PID}

$ perf script -i perf.data

当然了,perf有很多的用法,下面大致介绍一下。

有了perf,我还可以对应用程序发生的系统调用做一次详细的剖析。有了这些可以深层次的分析一个代码的调用关系。就像下面一样,压缩文件发生的是大量的read和write

# perf stat -e 'syscalls:sys_enter_*' gzip file 2>&1 | awk '$1 != 0'

 Performance counter stats for 'gzip file':

                 1      syscalls:sys_enter_utimensat
                 1      syscalls:sys_enter_unlink
                 3      syscalls:sys_enter_newfstat
                 1      syscalls:sys_enter_lseek
             2,180      syscalls:sys_enter_read
             4,337      syscalls:sys_enter_write
                 3      syscalls:sys_enter_access
                 1      syscalls:sys_enter_fchmod
                 1      syscalls:sys_enter_fchown


            ...

       2.309268546 seconds time elapsed

亦或者通过perf trace 去跟踪某个进程的系统调用。比starce好用多了。事实上前面也提到过strace是对性能很不友好的。这里可以看下,gzip同样的文件,相同的操作,被strace后,执行总是慢一些。我试了很多次,perf的追踪总是在2.3s左右,而strace就是2.9s左右。

# time strace -c gzip file
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 67.69    0.125751          29      4337           write
 27.36    0.050826          23      2180           read
  4.12    0.007661        7661         1           unlink
  0.20    0.000377          94         4           openat
  0.12    0.000231          77         3         3 access
  0.08    0.000157          22         7           close
  ...
------ ----------- ----------- --------- --------- ----------------
100.00    0.185767                  6568         4 total

real    0m2.919s
user    0m0.669s
sys    0m2.263s

perf最强大的还是 perf record,它支持先记录,后查看,记录完成后通过perf report查看。比如我想记录某个应用程序的IO情况。以SimpleHTTPServer为例,可以看到当从SimpleHTTPServer下载文件时的读磁盘的调用。

$ perf record -e block:block_rq_issue -ag -p ${Service PID}

$ perf report -i perf.data

Samples: 105  of event 'block:block_rq_issue', Event count (approx.): 105
  Children      Self  Trace output
-    0.95%     0.95%  8,0 R 0 () 24895224 + 1024 [python]
     0
     __GI___libc_read
     tracesys
     sys_read
     vfs_read
     do_sync_read
     xfs_file_aio_read
     xfs_file_buffered_aio_read
     generic_file_aio_read
     page_cache_async_readahead


   ondemand_readahead
     __do_page_cache_readahead
     ... ...

或者是对一个应用服务程序进行全方位的追踪

perf record -F 99 -ag -p ${Service PID} -- sleep 10

然后通过perf report -i perf.data 来进行分析

Samples: 21  of event 'cpu-clock', Event count (approx.): 5250000
  Children      Self  Command  Shared Object        Symbol
-   76.19%     0.00%  python   [kernel.vmlinux]     [k] system_call
   - system_call
      - 28.57% sys_recvfrom
           SYSC_recvfrom
         - sock_recvmsg
            + 23.81% inet_recvmsg
            - 4.76% security_socket_recvmsg
                 selinux_socket_recvmsg
                 sock_has_perm
                 avc_has_perm_flags
      + 23.81% sys_sendto
      + 19.05% sys_shutdown
      + 4.76% sys_newstat

这里的分析结果显示分为四列其中 Overhead 是我们需要关注的,因为这个比例占用的多的话,证明该程序的大部分时间都在处理这个事件。其次是Symbol,也就是函数名,未知的话会用16进制表示的。

perf stat 也是一个不错的程序性能分析工具,在上面的例子中,我通过perf stat记录了某个程序的系统调用。它可以提供一个整体情况和汇总数据。

下面这个是一个疯狂的C代码。可以看出,这是一个疯狂的循环。

void longa(){  int i,j;  for(i = 0; i < 10000000000000000; i++)
  j=i;
}void foo1(){  int i;  for(i = 0; i< 1000; i++)
     longa();
}int main(void){
  foo1();
}

编译后使用一下 perf stat 

$ perf stat ./a.out

 Performance counter stats for './a.out':

      30249.723058      task-clock (msec)         #    1.000 CPUs utilized
               150      context-switches          #    0.005 K/sec
                 2      cpu-migrations            #    0.000 K/sec
               113      page-faults               #    0.004 K/sec
   <not supported>      cycles
   <not supported>      instructions
   <not supported>      branches
   <not supported>      branch-misses

      30.260523538 seconds time elapsed

可以看出,这是一个cpu密集型程序,会大量耗费cpu的计算资源。

更多的例子可以到 大神brendan gregg的博客上看到,不仅仅是磁盘情况,还有更多奇妙的例子。

博客地址:http://www.brendangregg.com/perf.html

虽然可以通过 $ perf record -ag -p ${Service PID} 来记录追踪一个进程的所有事件,但是需要注意的是,动态追踪需要调试符号,这些调试符号诸如函数和变量的地址,数据结构和内存布局,映射回源代码的抽象实体的名称等等,如果没有的话,将看到一堆16进制地址。这是很痛苦的。

而我们这里大部分应用都是java服务,java服务是跑在jvm里的。如果直接使用record看到的全是vm引擎符号,这些只能让我们看到诸如gc一类的信息,看不到具体某个java的类和方法,不过可以通过 开源的 perf-map-agent,它通过虚拟机维护的 /tmp/perf-PID.map来进行符号的转换。但是由于x86上的hotspot省略了frame pointer,所以就算转换了符号,可能还是不能显示完整的堆栈。不过在JDK 8u60+可以通过添加-XX:+PreserveFramePointer。同样java的动态追踪可以参考大神brendan gregg的博客。

博客地址:

http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html#Java

当所需要的工具安装好且都配置完成后,可以使用如下命令对java服务进行动态追踪其调用过程。

git clone --depth=1 https://github.com/brendangregg/FlameGraphperf record -F 99 -a -g -- sleep 30; ./FlameGraph/jmaps
perf script > out.stacks01
cat out.stacks01 | ./FlameGraph/stackcollapse-perf.pl | grep -v cpu_idle | \
    ./FlameGraph/flamegraph.pl --color=java --hash > out.stacks01.svg

同样,systemtap也十分厉害的动态追踪框架,它把用户提供的脚本,转换为内核模块来执行,用来监测和跟踪内核行为。

systemtap就不在这里多做介绍了,有兴趣的朋友可以去systemtap官网看看,这里有许多现成的脚本,如网络监控(监控tcp的连接,监控内核丢包的源头等),磁盘监控(io监控,每个应用的读写时间等)等等。

相较于perf,systemtap的一个巨大的优势是systemtap是可编程的,想追踪什么写个脚本就ok了,目前perf也在支持可编程计划,eBPF的补丁计划加上后,perf会变得更加强大。

systemtap官网教程:

https://sourceware.org/systemtap/SystemTap_Beginners_Guide/useful-systemtap-scripts.html

一次故障的动态追踪过程

就在前不久,一阵急促的短信报警涌来,是线上服务器的load告警了,我开始扫码登陆服务器,熟练的使用 top -c  观察着线上服务器的指标。

大致现象我没有截图,口述一下吧,有2个服务的cpu使用率达到300%,wa有些高,我怀疑到是程序bug了疯狂读磁盘。于是使用iotop,查看io情况,可以看到总体的写磁盘速度是 135M/s 。而读请求几乎是0 ,这是怎么回事,这几个服务在疯狂写数据?不应该吧,这几个服务似乎没有这么大的写磁盘需求啊,如果有,应该就是日志了。在看日志前,先 perf record -ag -p ${Service Pid} 记录服务的状态。查看了应用服务的日志,消息队列似乎处理出错了,日志量巨大且繁杂,各种日志都有。到底哪里有问题呢?虽然已经定位到故障可能和消息队列有关,但是还不能确定是哪里的问题。

中断 perf record 后,我利用上面提到的方法,导出火焰图。

可以看到应用程序主要在做抛异常、网络相关调用、gc、写磁盘的操作。除了已知的操作外,问题服务的其余大量操作都集中在网络的数据包收发上,再结合之前看到消息队列的相关报错,应该定位是网络连接消息队列出的问题,应该消息队列连不上了,而代码有重试机制。

根据猜测,再到日志中找线索,果然是这个问题。如果是在大海般的日志中捞出有用的日志信息可能还需要些时间吧,这里需要提一下,传统的埋点多了不好,少了也不好,总归是比较难以权衡的。(因为该java服务没有开启PreserveFramePointer,所以看不到java代码级的调用)于是很快的完成了故障的定位,接下来就好办了,哪里有问题治哪里。

PS:perf 和 systemtap 的使用我这里只是很粗浅的介绍了一下,大神brendan gregg有详细博客去介绍动态追踪的每一个细节。开源社区也有很多动态追踪的扩展,如春哥在OpenResty的性能追踪上有很多十分赞的工具,同时我表示十分赞叹OpenResty的强大。我在动态追踪的路上还是一个初级学习者,远远比不上春哥等大神级别的人物,如果有什么错误也请指正。

参考文献:

http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html#Java

http://openresty.org/posts/dynamic-tracing/#rd?utm_source=tuicool&utm_medium=referral

http://www.brendangregg.com/perf.html

https://zhuanlan.zhihu.com/p/34511018

https://www.ibm.com/developerworks/cn/linux/l-cn-perf1/

文章首发于小米运维公众号,原文请戳:《浅谈动态追踪技术》

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浅谈动态追踪技术 的相关文章

  • SBUS协议:SBUS解析与合成

    在说协议之前 xff0c 我想强调一点 xff1a 信号要取反 xff0c 硬件取反 xff01 xff01 xff01 xff01 xff01 至于为什么强调 xff0c 我会在后面解释 xff0c 你们先记住 SBUS协议 xff1a
  • 上海灵信视觉A4控制板

    资料准备 xff1a 1 LED Player上位机控制 xff1a em span style font size 12px http www 168led com AjaxFile DownLoadFileNew aspx FilePa
  • stm32串口一直进USART1_IRQHandler

    今天在使用USART模块 xff0c 遇到了一些问题并解决了 xff0c 于是发贴共享 问题描述 xff1a 在使用USART做串口通讯时 xff0c 我只把接收中断打开 xff0c 并设置抢占优先级为最低一个级别 xff0c 而接收中断上
  • tensorflow载入报错Process finished with exit code -1073741819 (0xC0000005)

    这几天准备在现有的软件里加上caffe来测试一种新算法 发现windows下python3 6安装caffe是真的难 xff0c 只能装好python2 7的版本就放弃了 回来继续完善软件 xff0c 又发现软件里的tensorflow不能
  • python项目打包(自定义dll) anaconda3+pyinstaller

    目前手上有一个python 43 pyqt的项目需要打包 xff0c 所以查了一下打包的方法 下面介绍一下具体步骤 xff1a python打包有很多方法 xff0c py2exe xff0c pyinstaller等等 xff08 其实我
  • Docker(六)同一镜像有多个Tag情况下,执行 docker rmi 镜像ID 指令无法删除

    删除方法一 docker rmi f 镜像ID 删除方法二 docker rmi repository tag 参考 xff1a 1 https www imooc com article 35040
  • 《ROS机器人开发实践(胡春旭)》第十章MoveIt!机械臂控制 学习笔记

    r 在学习 ROS机器人开发实践 胡春旭 第10章的MoveIt xff01 时 xff0c 因为在自己创建的工作空间中没有下载作者的源代码 xff0c 所有有以下几个问题 xff1a 1 使用moveit setup assistant时
  • Android 根据网络分析运营商信息

    我们想获取手机的运营商信息 通常都会去调用系统的TelephonyManager类的取数据 但是很多时候可能取不到卡的信息 xff08 例如双卡手机和一些特殊卡 xff09 xff0c 这样就区别不了运营商了 但是有时候我们的需求要进行不通
  • 简单又好看的按钮,扁平化按钮。

    今天分享一下流行的扁平化按钮 完全不需要用到图片哦 效果图如下 xff1a 里面有2个按钮都是一样的模式 只要修改的色值就可以 下面跟我来更新你的UI吧 首先编写 button xml 代码如下 lt xml version 61 34 1
  • Android 获取运营商信息(完整版)-解决高通,MTK等双卡问题

    由于国内的运营商问题 xff0c 双卡手机获取IMSI号问题要根据厂商API 来实现 下面我们就来做一套完整的分析运营商获取IMSI号逻辑 1 xff0c 首先我们要判断手机的平台 1 1 xff0c 判断手机是否MTK平台 public
  • AstarPathfindingProject 中RVO碰撞体扩展

    原本库中只有矩形RVO碰撞体 xff0c 如果要添加自己的需要继承RVOObstacle抽象类 xff0c 重写里面的方法 例如下面的圆柱形碰撞 using UnityEngine if UNITY EDITOR using UnityEd
  • Android中抓取手机视频流数据。

    目前实时抓取手机视频数据有2种方法 xff0c 一种是通过camera的回调获取源数据 xff0c 这里获取的源数据是没有编码的数据 有的人发送yuv数据然后在那绘制图片 xff0c 也说视频聊天 xff0c 真是可笑 这种方式是可是实现视
  • Android 使用AudioRecord录音相关和音频文件的封装

    在Android中录音可以用MediaRecord录音 xff0c 操作比较简单 但是不够专业 xff0c 就是不能对音频进行处理 如果要进行音频的实时的处理或者音频的一些封装 就可以用AudioRecord来进行录音了 这里给出一段代码
  • Android 中使用MediaRecorder进行录像详解(视频录制)

    在这里给出自己的一个测试DEMO xff0c 里面注释很详细 简单的视频录制功能 package com video import java io IOException import android app Activity import
  • Android手机中获取手机号码和运营商信息

    代码如下 xff1a package com pei activity import android app Activity import android os Bundle import android view View import
  • C语言下划线开头的函数

    首先 xff0c C 43 43 里关于下划线的问题是源于C语言 xff0c 因为C 43 43 允许用extern C 来修饰代码以C语言语法方式编译 然后说C语言里的下划线 xff1a C语言确实允许以下划线开头的函数存在 xff0c
  • 校验和计算方法

    1 说明 xff1a 1 校验和覆盖的内容 xff1a IP校验和 xff1a IP首部 ICMP校验和 xff1a ICMP首部 43 ICMP数据 xff1b UDP TCP校验和 xff1a 首部 43 数据 43 12个字节伪首部
  • 布谷鸟算法浅谈与简单应用

    简介 布谷鸟算法是由剑桥大学Xin She Yang教授和S Deb于2009年提出的一种新兴的启发算法 xff0c 是一种通过模拟自然界当中布谷鸟 xff08 也就是杜鹃 xff0c 故该算法也称为杜鹃算法 xff09 在繁育后代的行为而
  • torchvision中inception v3的实现

    一 torchvision中inception v3的网络结构 论文中给的结构如下图所示 但是torchvision中的inception v3结构中并不是这么实现的 下面解释一下torchvision中的inception v3结构 xf

随机推荐

  • 实践 基于Arduino 的 平衡车

    完成样子 因为只是学习验证 xff0c 没用电烙铁 xff0c 只用了面包板来连接各个组件 xff0c 中间用扎带固定 xff08 不稳定 xff09 完成后能基本保持平衡 xff0c 但太大力去推容易倒 平衡原理 通过负反馈实现平衡 xf
  • CMake入门-04-自定义编译选项

    工作环境 系统 xff1a macOS Mojave 10 14 6CMake Version 3 15 0 rc4 Hello World 自定义编译选项 CMake 允许为项目增加编译选项 xff0c 从而可以根据用户的环境和需求选择最
  • Linux 驱动开发简单实例

    Xiuye XY于 2021 08 03 19 17 07 发布343 收藏 3 分类专栏 xff1a 笔记 C C 43 43 Linux 版权 编辑笔记同时被 3 个专栏收录正在上传 重新上传取消 128 篇文章0 订阅 订阅专栏 编辑
  • ros下编译安装package

    原文地址 配置Release目录 catkin config install修改CMakeList txt文件 修改节点中CMakeLists txt文件 假设此处我们的节点项目名称为 test node 即CMakeLists txt中p
  • 什么是解耦?

    什么是解耦 解耦就是用数学方法将两种运动分离开来处理问题 对项目划分为多个模块这种做法你有什么看法 xff1f 优势 劣势有哪些 xff1f 多模块化项目优势在于 xff1a 提高代码的重用率 xff0c 可维护性高 xff0c 架构灵活
  • HDFS-Tiering 数据分层存储

    1 背景 随着小米业务迅猛发展 xff0c 存储到 HDFS 集群的数据量不断增大 xff0c 存储成本也不断攀升 尤其是海外 HDFS 集群每 GB 数据的成本是国内集群的 10 倍左右 xff0c 如何优化海外集群的存储成本变得非常迫切
  • 米家插件平台的技术实践之路

    2016年小米正式发布米家品牌 xff0c 此后米家开始接入第三方的智能硬件产品 xff0c 小米的IoT生态也迎来了快速发展 截止到2020年Q3 xff0c 小米AIoT平台已连接的IoT设备 xff08 不包括智能手机及笔记本电脑 x
  • 拥抱开源 | Xiaomi Vela团队成果连连,喜讯不断

    Xiaomi Vela是基于开源实时操作系统NuttX打造的物联网操作系统 xff0c Vela可以在各种物联网硬件上提供统一的软件平台 xff0c 通过丰富的组件和标准化的软件框架 xff0c 打通碎片化的物联网应用场景 今年Xiaomi
  • 将开源进行到底!小米新一代Kaldi荣获2022数博会“领先科技成果”奖

    5月26日 xff0c 数博会开幕式当天揭晓了 2022中国国际大数据产业博览会数博发布之领先科技成果 奖 xff0c 小米公司 新一代Kaldi 项目 xff0c 凭借全自研的创新成果和突出的社会价值 xff0c 获得评委会一致认可 xf
  • 小米AI实验室4篇论文入选语音技术顶会INTERSPEECH 2022

    滴滴 重磅消息新鲜出炉 xff01 xff01 全球语音领域顶级会议 INTERSPEECH 2022公布了论文入选名单 xff0c 小米 AI 实验室4篇论文被接收 INTERSPEECH 是由国际语音通信协会ISCA组织的语音领域的顶级
  • 干货 | 足式机器人运动控制发展方向——轨迹优化

    运动控制技术的进步使得足式机器人的运动能力更强 xff0c 而近来轨迹优化作为主流学术研究方向 xff0c 能够为足式机器人运动控制的发展提供可能的指引 本期技术干货 xff0c 我们邀请到了小米工程师徐喆 xff0c 向我们介绍足式机器人
  • GPS定位

    链接 天地图 xff0c 免费的 xff0c API开放的地图定位系统 链接 RTK和GPS定位 链接 rtk 精确定位 简介 链接 GPS RTK PPK三种定位技术的原理及应用 双频定位 xff0c 双频信号协同工作 xff0c 提供亚
  • 清华软件论坛 | 推动移动传感的极限:AIoT时代的智能健康和数字家庭

    清华软件论坛 xff0c 是在清华大学软件学院成立20周年之际创立的 xff0c 旨在探索软件科学基础理论 创新软件前沿技术 思辩软件工程方法 促进学科交叉融合 xff0c 持续提升清华软件发展水平 xff0c 清华大学软件学院打造 清华软
  • 国家级表彰 | 小米人工智能实验室声学语音团队荣获“全国工人先锋号”荣誉称号...

    小米人工智能实验室声学语音团队代表王育军接受央视采访 4月27日 xff0c 小米集团技术委员会人工智能实验室声学语音团队荣获由中华全国总工会颁发的 全国工人先锋号 荣誉称号 颁奖典礼在人民大会堂举行 xff0c 小米声学语音技术总监王育军
  • Tech Talk | 还原照片不同亮度范围细节——RAW HDR技术

    拍照时 xff0c 你是否遇到过这些情况呢 xff1f 拍摄的成片暗区过暗 xff0c 高亮区域过曝 逆光拍摄中 xff0c 会出现 鬼影 暗部噪声偏大导致图像出现瑕疵 照片的高光和暗区细节得总是不到完美呈现 xff0c 这是所有拍摄设备都
  • 技术人文 | 你的加入,会为更多人争取避险时间

    如图文未加载 xff0c 请刷新后重试 今天是第15个全国防灾减灾日 xff0c 不仅要提高意识预防于未然 xff0c 其实你也可以贡献一份力量 2019年 xff0c 小米与成都高新减灾所共同探索 合作研发 xff0c 发布了全球首个操作
  • 一篇文章搞懂HDFS管理权限

    小米的HDFS承载了公司内多个部门几十条业务线的几十PB数据 xff0c 这些数据有些是安全级别非常高的用户隐私数据 xff0c 也有被广泛被多个业务线使用的基础数据 xff0c 不同的业务之间有着复杂的数据依赖 因此 xff0c 如何管理
  • 2018年度小米运维盘点

    元旦假期一眨眼就没了 xff0c 2018年也嗖的一下就过去了 xff0c 这一年里发生的大事件你都还记得吗 xff1f 下面就让小编带你回顾一下过去这一年里小米运维的知识点吧 xff01 2018年我们推送了很多被读者认可的文章 xff0
  • 网络工程师眼中的自动化运维

    本文从一名网工从业者的角度出发 xff0c 探讨了在企业网运维过程中 xff0c 网络工程师可以用什么样的工具让网络更加透明高效 上篇文章回顾 xff1a Apache Ranger Hadoop ACL控制工具 引言 网络就像wifi x
  • 浅谈动态追踪技术

    本文主要介绍了动态追踪技术 xff0c 并举例说明动态追踪技术的应用 身为一个SRE xff0c 工作中经常会遇到各种奇奇怪怪的服务异常问题 这些问题在staging xff08 测试环境 xff09 没有发现 xff0c 但放到真实的生产