分类 软件 下的文章

最近在做一个服务器能耗监测相关的工具,因为涉及到微服务,最终选定了Kubernetes作为平台。既然涉及到性能监控,一番搜索后,自然离不开该领域的“明星”Prometheus。

Prometheus是一个非常通用的性能数据收集工具。有多通用呢?通用到它几乎无法直接从任何性能数据源获取任何数据,必须通过类似驱动的中间件(官方称呼为exporter,译为导出器)对数据进行文本化的格式化处理,才能被Prometheus解析并记录下来。这一方面意味着Prometheus本身“一无是处”,而又意味着开发团队可以不用顾及任何数据源的兼容性,可以专心开发与监控相关的核心功能。

那么问题就来了:Prometheus是作为一个单体应用而设计的,接入方式可以说是“四通八达”,而性能数据收集往往涉及系统底层访问,时常需要提权操作;而Kubernetes可以说是一个半封闭式的系统,通过隔离性削减了很大一部分的特权级别的功能。好在Docker和Kubernetes做出了妥协,我们还是有机会通过参数强制开放危险权限以达成目的的。

CoreOS作为云计算领域的明星角色,在相当广泛的领域提供了大量开源组件的实现,比如CoreOS本体,Kubernetes网络层插件Flannel(据说是最好配置的CNI,但我就从来没安装成功过),等等。这次的主角Prometheus Operator也是源自CoreOS项目组。

默认情况下Service基于selector自动创建Endpoints,但是由于ipmi_exporter暂时没办法部署在容器里,所以用Service+Pod的方法行不通。Prometheus Operator只能用Service里定义的端口进行数据监控,所以改端口没什么用,必须创建包含目标端口的服务。思路是,先手动创建Endpoints,再基于Endpoints创建Service,这样Service就可以用现有的Endpoints提供服务。

Probe和Monitor好像不是同一种用法,所以就没用了。

  1. Service要与Endpoints重名,这样才能让Endpoints覆盖Service以提供服务
  2. Service不能写selector,不然会覆盖Endpoints
  3. 在一个Endpoints里写多个address即可
  4. serviceMonitorselector要与Servicelabel相对应

参考: https://devops.college/prometheus-operator-how-to-monitor-an-external-service-3cb6ac8d5acb
https://www.jianshu.com/p/005112fd2f0a

在使用bt下载大型文件的时候,可能面临下载软件要初始化文件的问题。这是为了避免相同逻辑地址残留的历史数据无意或有意损坏文件的完整性(盲猜哈希碰撞)。对于固态硬盘来说,无疑是对底层Flash芯片的一次折磨(即便是置零,大多数情况下也会被主控识别为有效数据,写真实数据的时候还要再进行一次擦除,白白浪费了一次读写寿命);对于机械硬盘来说,受到读写速率的限制,会在相当一段时间内影响该磁盘的整体读写性能。因而,无论使用哪种存储介质,都会下意识尽可能避免该种情况。

方法是从reddit上看来的:确保设置中的disk.no_zerotrue,并使用管理员权限启动uTorrent。

目测原理是给了管理员权限之后,uTorrent可以调用Windows创建类空洞文件的权限(即声明空间但暂不分配、初始化)。

提供类似功能的工具为fsutil

fsutil file createnew <filename> <length-in-bytes>

[IPM] (http://ipm-hpc.sourceforge.net/)(Integrated Performance Monitoring)是用于MPI性能评测的一套软件库,声称可以收集MPI函数运行时间、通信拓扑、通信量统计、能耗统计等等功能。

https://stackoverflow.com/questions/43002936/what-are-the-differences-between-the-mpi-functions-and-pmpi-functions

这个问题解决了我在阅读IPM源码的时候发现的MPI_开头和PMPI_开头的函数的区别和关系的疑惑,同时也解决了我对于IPM运行原理的疑惑。

主要原理就是通过使用加了debug逻辑的IPM库代替原始MPI函数,达到既不影响原有程序执行,又能收集性能数据的目的。

达成目的的方法有两种,一是经典的显示链接,在编译时就指定要使用IPM版的MPI函数实现;二是利用动态库的骚操作,利用系统环境变量“劫持”运行时程序要调用的MPI实现,通过LD_PRELOAD的优先级实现。

因为最近要用到YCSB,需要了解其中的工作原理,因而被迫RTFSC

虽然YCSB使用Java实现,我之前也用Java写过简单的SpringBoot,但当时也只是简单的处理依赖关系,骚操作没有YCSB这么多,因而这也算是第一次正式地使用Maven了。

POM,Project Object Model,顾名思义,可以理解为对当前项目的“建模”,实现上采用了XML文件的形式来描述项目的结构,包括项目名、版本、以及其他和C/C++项目类似的文件结构的定义(源码、库、资源文件等)。

简要介绍一下常用,但网上解释不是很清晰的的XML块(补充性质):

  • profiles profiles中可以有多个profile,每个profile由一个id和一组properties组成,若当前profile和id对应的时候,当前的properties就被激活。属性在properties中以<key>value</key>的XML格式声明,使用时用类shell的${}操作符包裹key以获取属性值。(平时XML用得少,不是很习惯这种写法)

  • assembly 一开始以为是汇编,存放的是什么低级字节码一类的,后来发现是打包,= = 在此可以声明自定义规则,format(s)块用于声明打包文件类型,fileSet(s)声明主要文件映射,dependencySet(s)声明依赖文件映射。这里的映射是指源文件目录结构到压缩文件目录结构之间的,动作是将指定文件添加入压缩文件。directoryoutputDirectoryinclude(s)依次声明一个fileSet所指向的目录、所要包含的文件和目标路径。