perf与火焰图
perf它是 Linux 系统原生提供的性能分析工具,会返回 CPU 正在执行的函数名以及调用栈(stack)。
1sudo yum install perf-3.10.0
通常,它的执行频率是 99Hz(每秒99次),如果99次都返回同一个函数名,那就说明 CPU 这一秒钟都在执行同一个函数,可能存在性能问题。
1sudo perf record -F 99 -p 1921 -g -o perf.data -- sleep 60
上面的代码中,perf record表示记录,-F 99表示每秒99次,-p 1921是进程号,即对哪个进程进行分析,-g表示记录调用栈,sleep 30则是持续30秒。-o表示输出到哪个文件中
如果一台服务器有16个 CPU,每秒抽样99次,持续30秒,就得到 47,520 个调用栈,长达几十万甚至上百万行。
为了便于阅读,perf record命令可以统计每个调用栈出现的百分比,然后从高到低排列。
1$sudo perf report -n --stdio
火焰图火焰图是基于 perf 结果产生的 SVG 图片,用来展示 CPU 的调用栈。
1 ...
IDE Cheatsheet
IDE CheatsheetVscodeVsCode通用快捷键跳转Ctrl+ 返回光标上次停留位置
Ctrl + Tab 列出最近打开的文件,按住Ctrl连按Tab再放手可以跳转到文件
Command + P 搜索文件,且支持 :行号 或者 @符号
F12 跳转到函数或符号的定义
查看option+F12 预览函数或符号的定义,与单纯的F12区别是在当前文件开启一个小浮窗查看
shift+F12 预览光标所在函数/变量在所有文件的引用,同上
shift+command+O:查看当前文件所有符号
Option + Command + [ 括号收缩
Option + Command + ] 括号展开
格式ctrl + ] 行增加缩进:
ctrl + [ 行减少缩进:
插件VsCode插件——Bookmarks:
option+command + L 添加/删除书签
opiton+command + J 上一个书签
opiton+command + L 下一个书签
IDEA导航(Navigation)主要是以Command开头的
⇧⇧: 万能搜索
⌘L: Go to ...
GDB Cheatsheet
gdb cheatsheetGDBgdb调试中直接输入回车是重复上一步命令
start:临时断点打在main函数处,等候进一步指令
r(run):从main函数处开始运行程序,直至程序结束/出错/到达断点
shell ls / !ls:在gdb中执行shell命令
set prompt (xxxx) :修改命令提示符前缀,默认是(gdb),多gdb调试时用来区分
$gdb -args ./a.out a b c / (gdb) set args a b c:指定程序的命令行参数,下次调用run时就会使用a b c参数,也可以(gdb) run a b c / (gdb) start a b c
set logging on:将gdb调试的历史保存到日志中;set logging file xx.file:指定gdb调试日志名字,默认是gdb.txt;set logging overwrite on:覆盖之前的gdb调试日志,默认是追加写gdb调试日志
函数info functions:列出可执行文件的所有函数名称
info ...
阿里云表格存储介绍
本文所有内容均来自于阿里云官网
简介TableStore是阿里云自研的多模型结构化数据存储,提供海量结构化数据存储和快速查询和分析服务,其分布式存储和索引引擎能够支持PB级存储,千万TPS以及毫秒级延迟的服务能力。
存储引擎与索引引擎在OTS的服务端有两个引擎,存储引擎和索引引擎,他们的数据结构和底层原理都是不同的,即表引擎(Table)和多元索引引擎(Searchindex)
全托管表格存储是一种全托管的结构化数据存储。使用表格存储您只需专注于业务研发,无需担心软硬件预置、配置、故障、集群扩展、安全等问题,在保证高服务可用性的同时,极大地减少了管理及运维成本。
多模型
Wide column模型:一款经典模型,目前绝大部分半结构化、结构化数据都存储在Wide column模型系统中。
Timeline模型:表格存储自研模型,主要用于消息数据,适用于IM、Feed和物联网设备消息下推等消息系统中消息的存储和同步,目前已被广泛使用。(syncserver的推送位点)
Timestream模型:适用于时序数据、时空数据等核心数据场景。
Grid模型:适用于科学大数据的存储和查询场景。
...
Shell Cheatsheet
shell是提供与内核沟通接口的命令解释器程序,但实际上shell是这种解释器的统称,Linux系统的shell种类很多,包括Bourne shell(简称sh)、Bourne Again shell(简称bash)、C shell(简称csh)、K shell(简称ksh)、Shell for Root等等。
sh和bash都是Linux系统shell的一种,其中bash命令是sh命令的超集,大多数sh脚本都可以在bash下运行。Linux系统中预设默认使用的就是bash。
基础Linux提供的Shell解析器有:
1234567[atguigu@hadoop101 ~]$ cat /etc/shells /bin/sh/bin/bash/sbin/nologin/bin/dash/bin/tcsh/bin/csh
执行方式shell脚本以#!/bin/bash开头(指定解析器)
1234567891011121314151617181920212223# 创建脚本[linux@localhost datas]$ cat helloworld.sh #!/bin/bashecho ...
《设计数据密集型应用》的笔记
设计数据密集型应用设计数据密集型应用 - 中文翻译
第一部分:数据系统的基石第一章:可靠性,可扩展性,可维护性如今很多应用程序都是数据密集型而不是计算密集型的
存储数据,以便自己或其他应用程序之后能再次找到 (数据库(database))
记住开销昂贵操作的结果,加快读取速度(缓存(cache))
允许用户按关键字搜索数据,或以各种方式对数据进行过滤(搜索索引(search indexes))
向其他进程发送消息,进行异步处理(流处理(stream processing))
定期处理累积的大批量数据(批处理(batch processing))
本书着重讨论三个在大多数软件系统中都很重要的问题:
可靠性(Reliability) 系统在困境(adversity)(硬件故障、软件故障、人为错误)中仍可正常工作(正确完成功能,并能达到期望的性能水准)。
可扩展性(Scalability) 有合理的办法应对系统的增长(数据量、流量、复杂性),负载参数(load parameters)描述系统当前负载
可维护性(Maintainability) 许多不同的人(工程师、运维)在不同 ...
博弈论
博弈论博弈论,又称为对策论(Game Theory),它是现代数学的一个新分支,也是运筹学的重要学科。博弈论研究的是具有竞争性质的现象,它考虑博弈中个体的倾向行为与实际行为,研究个体的行为所带来的影响。博弈论最早用于解释经济现象,比如垄断、生产,1944年出版的《博弈论和经济行为》引进了通用博弈的思想。1950年,纳什提出了后来被称为“纳什均衡”的概念。博弈论发展飞快,它成为经济学里广泛使用的数学分析工具之一,在生物、政治、军事、国际关系等学科都有广泛应用。经过前人不断探索,时至今日,博弈论已经发展成为一门比较完善的学科。
通常情况,博弈模型主要由三要素组成:
参与人:参与人是参与到博弈游戏的个体,每个参与人都有自己的决策权,如果参与人只有两位,则称为“两人博弈”,如果有更多的参与者,则称为“多人博弈”。参与人集合设为有限集。
策略:在一场博弈中,参与人可以行使自己的决策权,选择一个实际可行的行动方案,这个行动方案称为“策略”,策略不是凭空想象地,必须从有限的策略空间中选出。每个参与者的策略空间不尽相同,用si表示参与人选择的某个策略,用Si表示参与人的策略空间。
收益(或称效 ...
Linux定时器与时间管理
Linux中的定时器与时间管理时间概念周期性产生的事件——比如每10ms一次——都是由系统定时器驱动的。系统定时器是一种可编程硬件芯片,它能以固定频率产生中断。该中断就是所谓的定时器中断,它所对应的中断处理程序负责更新系统时间,也负责执行需要周期性运行的任务。
内核知道连续两次时钟中断的间隔时间,这个间隔时间就称为节拍(tick),它等于节拍率分之一(1/(tick rate))秒。内核就是靠这种已知的时钟中断间隔来计算墙上时间和系统运行时间的。墙上时间(也就是实际时间)对用户空间的应用程序来说是最重要的。内核通过控制时钟中断维护实际时间,另外内核也为用户空间提供了一组系统调用以获取实际日期和实际时间。系统运行时间(自系统启动开始所经的时间)对用户空间和内核都很有用,因为许多程序都必须清楚流逝的时间。通过两次(现在和以后)读取运行时间再计算它们的差,就可以得到相对的流逝的时间了。
节拍率系统定时器频率(节拍率)是通过静态预处理定义的,也就是HZ(赫兹),在系统启动时按照HZ值对硬件进行设置。体系结构不同,HZ的值也不同,大部分是100HZ,又有1000HZ。编写内核代码时,不 ...
Linux进程管理与调度
Linux中的进程管理摘自:Linux内核设计与实现
进程是运行中的程序以及与该运行程序相关的资源的总合
Linux对线程和进程并不特别区分,对于Linux而言,线程只是一种特殊的进程罢了
进程描述符及其任务结构任务队列与task_struct: Linux中的进程又叫做任务,内核把进程列表放在叫做**任务队列(task list)的双向循环链表中,链表中的每一项都是task_struct,称为进程描述符(process descriptor)**,其包含的数据能够完整地描述一个正在执行的程序:打开的文件,进程的地址空间,挂起的信号,进程的状态等等
1234567891011struct task_struct { unsigned long state; int prio; unsigned long policy; struct task struct *parent; // 当前进程的父进程 struct list_head tasks; // 当前进程的子进程链表 pid_t pid; // 链表中的下一节点 // 链表 ...
预处理阶段
预处理宏定义只是替换文本,需要加上括号,这里很容易掉入坑中,因为先替换后计算
123456789101112131415161718192021// 变量case#define N 2+9int a = N*N; // 预期输出121cout << a << endl; // 输出29,因为a=2+9*2+9=29,可见只是简单的替换,应更改为#define N (2+9)// 函数case#define area(x) x*xint y = area(2+2); // 预期输出16cout << y << endl; // 输出8,因为y=2+2*2+2=8// 尝试解决函数case#define area(x) (x)*(x)int yy = area(2+2); // 预期输出16cout << yy << endl; // 输出16,因为yy=(2+2)*(2+2)=16int yyy = area(2+2)/area(2+2); // 预期输出1cout << yyy << end ...