https://pic4.zhimg.com/v2-e263475646652726731e13e44b5d2479_im.jpg

Cache高速缓存

Cache和内存地址映射 1、直接相联映射 内存指定的块只能缓存到指定的Cache行中,采用mod的方式,并且块号用中间的位数,这样主要是为了能利用局部性原理将附近的几个块都能够有机会同时缓存起来 缺点是缓存利用率底,指定的块只能对应指定的行,如果对应的缓存行慢了,即时其他缓存行空着也无法缓存,需要将自己对应的缓存行的数据置换出去 2、全相联映射 内存每块都可以映射到Cache的每一行,优点是缓存利用率高,缺点是查找缓存效率低,需要遍历查找所有缓存行判断当前地址是否存在与缓存中 3、组相联映射 直接映射+全相联映射的结合,将多块分为一组,同时将缓存行里面的多行分为一组,每组内采用全相联映射,组间采用直接相联映射 ​ Cache数据读取和写入 读命中和读不命中 CPU拿到真实的内存地址之后需要先检查Cache是否命中,如果命中则直接返回,否则需要向下一级Cache加载数据。如果下一级也没有命中则需要直接访问内存,访问内存的时候通常会根据局部性原理预读一些数据到各级缓存中 写命中 写数据的时候如果Cache命中了,则我们需要考虑多级缓存以及和内存同步问题,因为L3缓存、内存等都是多核共享的,如果不能及时将脏数据更新回L3或则内存则会造成数据不一致问题,通常有下面两种处理方式: Write Through 直写 如果写命中,则直接同时跟新当前Cache以及下一级Cache、内存等,这种方式能很好的保障数据一致性,但是会引起总线流量过大,每次写都需要立即更新 Write Back 写回 如果写命中则不会立即更新下一级缓存或则内存,而是标记位dirty ,等到此缓存行被替换的时候再写回,此策略的缺点就是无法保障数据一致性,优点就是可以减少总线流量 写不命中 写数据如果没有命中Cache,则也会有如下几个策略: Write Allocate 写分配 首先加载对应的数据到缓存行中,然后往缓存里面写入,此策略通常和 Write Back 配套 Not Write Allocate 非写分配 避开高速缓存,直接操作内存,此策略通常是与 Write Through 配套 综上: 我们得出,Cache一致性问题有两种策略解决 (命中和不命中两种情况对应的策略) Write Through+Not Write Allocate Write Back + Write Allocate ​ Cache分级 L1缓存分为两种: 指令缓存和数据缓存 L2缓存为每个核单独享有,一个更大的缓存 L3缓存为多核共享,在L3中不需要考虑数据不一致问题,因为CPU都可以访问L3 ​ Cache一致性问题[TODO] 写传播: 一个CPU的cache跟新时需要传播到其它的CPU的cache中 事务串行化(锁内存) ​ 参考 关于CPU上的高速缓存 10 张图打开 CPU 缓存一致性的大门 【写的不错】

gcc生成链接库

C语言中.h头文件作用 .h头文件只是用来声明一些东西,编译的时候并不参与编译 ​ 生成.o可执行文件 在一个多文件的C语言项目中,需要将多个.o可执行文件链接起来称为一个二进制可执行文件,这样才可以执行 比如下面 hello.h hello.c void echo(char *msg); #include "hello.h" #include <stdio.h> void echo(char *msg) { printf("%s\n", msg); } util.h util.c int add(int n1, int n2); #include "util.h" int add(int n1, int n2) { return n1 + n2; } main,c #include <stdio.h> #include "util.h" #include "hello.h" int main(int argc, char const *argv[]) { int n1 = 1, n2 = 2; int n3 = add(n1, n2); printf("%d+%d=%d\n", n1, n2, n3); echo("hello,world\n"); return 0; } 编译的时候我们只需要将所有其他文件编译为.

Prometheus和监控系统

编写自己的exporter 其实要编写自己的exporter只需要返回符合Prometheus指定格式的监控数据即可,我们可以自己构造这样的数据,也可以使用Prometheus提供的库来进行构建 ​ 容器监控 容器的监控可以配合cAdvisor进行 ​ 日志监控 探针监控 Blackbox prober exporter https://github.com/prometheus/blackbox_exporter ​ 巨人肩膀 Prometheus+Grafana+Alertmanager实现告警推送教程 —– 图文详解 Prometheus操作指南 (纯干货)47节课程带你掌握Prometheus企业级监控【配套课件见简介】

sar系统活动情况报道

sar命令 sar是系统运行状态统计信息的工具,指定时间取样然后报告系统情况 使用sar命令之前需要开启sysstat允许收集信息的配置 vim /etc/default/sysstat ​ 查看CPU信息 -u 查看CPU利用率 sar 1 5 #默认就是-u sar -u 1 5 # 1s展示一次 一共5次 sar -u 1 5 -P 0 #指定CPU核 -q 查看CPU负载 sar -q 1 5 -I 查看CPU中断情况 sar -I ALL sar -I SUM -w 查看CPU上下文切换情况 sar -w 1 5 ​ 查看内存信息 -r 查看内存利用率 sar -r 1 5 -S 查看swap区大小 -W 查看交换区使用情况 sar -W sar -S -B 查看内存页情况 sar -B ​ 查看I/O信息 -b 查看IO读写情况

为什么Linux空目录是4k大小

由这个问题还可以衍生出一个问题 为什么文件(一切皆文件,包括目录也是一个文件)大小的单位都是4k的倍数? 要解决这个文件首先我们需要搞清楚Linux的VFS虚拟文件系统和inode机制,以及Linux操作系统是如何管理磁盘的如何从磁盘读写数据的 Linux为了提高读写磁盘的效率,将磁盘分割为一个个4k的块,然后以块为单位读写。操作系统会在inode中设置文件数据保存的块的索引,读取的时候再以块为单位读取到内存 所以一个文件大小的单位都可以被4k整除,因为操作系统会按磁盘块来进行申请空间 为什么空的普通文件大小为0k而空目录文件大小为4k ? 因为一个新创建的目录下会保存.和..这两个目录 一个是到当前目录的目录项 一个是到上一层目录的项 所以任何一个新的目录初始的大小一定是4k开始

crontab命令执行定时任务

crontab概述 crontab用来在Linux下执行定时任务的工具,Linux下定时任务主要分为系统任务和用户自定义任务两大类 系统执行的工作:系统周期性所要执行的工作,如备份系统数据、清理缓存 个人执行的工作:某个用户定期要做的工作,例如每隔10分钟检查邮件服务器是否有新信,这些工作可由每个用户自行设置 ​ crontab基本用法 使用之前我们需要设置一个crontab配置文件的默认编辑器 export EDITOR="vim" 然后我们可以使用如下命令编辑crontab配置文件,设置定时任务 crontab -e #打开当前用户的配置文件进行编辑 sudo crontab -u test -e #指定用户 配置文件里的写法就是先写cron时间表达式,然后再追加需要执行的任务 * * * * * echo "hello,world" >> /temp/log 我们查看配置文件的定时任务可以使用如下命令查看 crontab -l 可以使用如下命令删除配置文件所有的定时任务 crontab -r ​ cron时间表达式 * * * * * | | | | | | | | | +----- 星期中星期几 (0 - 6) (星期天 为0) | | | +---------- 月份 (1 - 12) | | +--------------- 一个月中的第几天 (1 - 31) | +-------------------- 小时 (0 - 23) +------------------------- 分钟 (0 - 59) * 代表整个时间段

find命令查找文件

find命令 find用于在任意的路径下过滤符合条件的文件 ​ find基本用法 find后面可以追加多个路径,在多个路径下查找,但是如果不添加路径则表示在命令执行的路径下查找 find <查找路径>... <条件参数>... 列出指定路径下所有的文件 find ~/temp ~/bin ​ 按文件名查找 -name find . -name "*.jpg" #查找以jpg结尾的文件 find . -name "?.jpg" #查找a.jpg这样的文件 find . -name "[abcdef].jpg" #查找a.jpg ... f.jpg -iname 忽略大小写 find -iname "[a-z]*.txt" #a.TXT也可找到 ​ 按时间查找 -atime: Access Time -mtime: Modify Time -ctime: Change Time +n n天前 -n n天内 find . -atime -2 #查找2天内被访问过的文件 find . -atime +2 #查找2天前被访问过的文件 -amin 按分钟为单位查找 find . -amin -10 #查找10分钟以内被访问过的 -newer 找出比指定文件修改时间更长的所有文件

tcpdump命令分析网络

tcpdump概述 tcpdump是Linux下的网络抓包工具,使用 libpcap 库来抓取网络数据包 ​ tcpdump用法 -n 不解析主机名 -nn 不解析端口和主机名 -i 指定监听的网卡 -i any 监听所有网卡 #默认不加-i则监听默认的网卡 -v 显示更多信息 -e 显示链路层信息 -A 显示ASCII -X 显示为16进制 抓取特定协议的数据包 tcpdump -nn -i wlp0s20f3 udp 抓取特定IP的数据包,也可以指定一个网段 tcpdump -nn -i any host 192.168.0.1 tcpdump -nn -i any host 192.168.0.0/16 tcpdump -nn -i any src 192.168.0.1 tcpdump -nn -i any dst 192.168.0.1 tcpdump -nn -i any src 192.168.0.1 and dst 192.168.0.23 抓取指定端口的报文 sudo tcpdump -nn -i wlp0s20f3 tcp port 8080 sudo tcpdump -nn -i wlp0s20f3 tcp dst port 8080 将抓取到的数据包写入文件,-s指定抓取每个报文的大小,0则表示抓取整个报文,不加-s默认只抓取每个报文的前96byte

awk工具

awk和sed区别 他们都是Linux下的 流处理工具 awk核心是格式化 sed 核心是 正则 ​ print输出和格式化 BEGIN { username="lyer" age=18 OFS="-" #指定print分割符号,默认是\t print "hello,","world" print "I'm",username,age print "a","b","c" } # -16 不足的往右边填空格 # 16 不足的往左边填空格 { #printf "%-16s %-16s %-16s\n",$1,$2,$3 printf "%16s %16s %16s\n",$1,$2,$3 } END{ a = sprintf("%16s %16s","hello","world") print a } ​ NR输出行 输出第1行 awk 'NR==1' net.txt 输出[1,4]行 awk 'NR==1,NR==4' net.txt awk 'NR>=1 && NR<=4' net.txt 输出行号,$0表示整行数据 awk 'NR==1,NR==5 {print NR,$0}' net.txt 范围打印,打印前n行 awk 'NR>=1250 {print NR,$0}' net.

iptables总结

iptables和netfilter netfilter 是 Linux 内置的一种防火墙机制,用于过滤网络数据包,而iptables则是一个用于配置netfilter防火墙的命令行工具 ​ iptables命令格式 iptables命令格式 iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型] 不加-t指定表名则默认操作的是filter表 不加指定的链名则会展示表的所有的链规则 ​ 四表和五链和数据流向 注意,在OUTPUT之后会通过route表进行路由选择,选择出口的网卡 iptables匹配规则如下,按规则的排列顺序逐一匹配,只要匹配到了就不会再继续往下匹配,就传递给下一个链了,所以我们需要将优先级更高的规则防止在前面 ​ 查看iptables 查看主要是使用-L命令,表示list的意思 查看nat表的OUTPUT链规则 iptables -t nat -nvL OUTPUT n不解析域名,直接显示IP v显示详细信息 L 表示list展示的意思 一般都会加上-nvL来查看iptables规则 查看filter表的OUTPUT规则 iptables -nvL OUTPUT ​ 编写iptables规则 -A命令添加iptables规则 -j后面加控制类型 filter主要有如下控制类型 控制类型 解释 ACCEPT 允许传递数据包 DROP 丢弃数据包,不响应 REJECT 拒绝数据包,响应RST LOG 在/var/log/messages文件中记录日志信息,然后再继续传递 iptables -A INPUT -j DROP #丢弃所有数据包 iptables -A INPUT -j ACCEPT #接受所有数据包 -I表示插入iptables规则,插入到指定的行,原来的行后移 iptables -I INPUT 2 -s 10.