分类 未分类 下的文章

关于

论文: Linux Block IO: Introducing Multi-queue SSD Access on
Multi-core Systems

IO 块设备的吞吐发展迅速,2012 年 SSD 4K 随机读写速度达到 785K IOPS (是不是有点高?)
SSD 随机读写速度与顺序读写持平 (不太清楚)

传统 块设备 队列优点:

  • 统一接口

    缺点:

  • 效率低,导致一些应用跳过块数据管理层
  • 单队列,单锁,造成核间竞争
  • 只有一个核处理与块设备通信,其他核需要软中断与该核通信,并且对于不同 NUMA 下的内存不友好

解决方案:

两层队列
软件队列:每个 NUMA 上 或者每个核上 一个队列
硬件队列:每个块设备上 若干队列

tag : 指示 block IO 在 driver 提交队列中的位置,在 IO 完成时指示位置

代码

hctx : hardware context

每个 request_queue 包含若干 request,包含一个 percpu 的 blk_mq_ctx (queue_ctx) ,包含若干 blk_mq_hw_ctx

每个 request 有一个 blk_mq_ctx

每个 blk_mq_hw_ctx 中包含若干 blk_mq_ctx

目前维护了 hardcoding 的 per-cpu 软件队列

使用 sbitmap 维护 pending work

struct blk_mq_hw_ctx { // include/linux/blk-mq.h
    struct {
        spinlock_t        lock;
        struct list_head    dispatch;
        unsigned long        state;        /* BLK_MQ_S_* flags */
    }
    struct blk_mq_ctx    **ctxs;
    struct blk_mq_tags    *tags; // bitmap tag
}

struct blk_mq_ctx  { // block/blk-mq.h
    unsigned int        cpu; // ctx 对应的 cpu ?
}

struct blk_mq_tags { // block/blk-mq-tag.h
    struct request **rqs; // rqs[tag] 为下标 tag 对应的 request 
}

struct request_queue { //include/linux/blkdev.h
    struct percpu_ref q_usage_counter;
    struct blk_mq_ctx __percpu    *queue_ctx; // per cpu 的本队列 context
    struct blk_mq_hw_ctx    **queue_hw_ctx; // 所有 hardware dispatch queue context ? 
    unsigned int        *mq_map; // 每个 cpu 对应的 hw_ctx 编号 ?
}
struct request { //include/linux/blkdev.h
    struct request_queue *q;
}

暗黑的shell修改文件操作

几个命令: cut, sed, awk

cut

echo [str] | cut -d [sep] -f [num] #使用分割符[sep]切分字符串[str]并返回第[num]段(从1编号) 

sed

sed -e '[desc] [str]' [file] #对文件[file]按照"[desc] [str]"进行修改,并将修改内容输出,原文件保持不变

其中 [desc] 部分格式为 [line][op],或 [start line],[end line][op],对 第[line] 行,或者 [start line][end line] 之间所有行进行 [op] 操作
其中行编号1-based,行区间为闭区间
[op] 可以为以下操作:

  • a : 新增行
  • d : 删除行
  • c : 替换(用 [str] 替换选中所有行)
  • d : 删除(一般没有 [str] 部分)
  • i : 插入
  • s : 替换("[start line],[end line]s/[old pattern]/[new pattern]/"

全局替换: s/[old pattern]/[new pattern]/g

sed -n: (--silent) 只显示处理后的结果

example

cat [file] | sed -n '5,7p' #显示文件5到7行
cat [file] | sed  '/oo/d' #删除所有包含"oo"的行,其他行输出

awk

test
block 'test1'

#include <bits/stdc++.h>
using namespace std;
int main() {
    return 0;
}

srun [script] 提交 interactive 的脚本
sbatch [script] 脚本在后台运行,输出保存到文件

脚本头部指定 slurm 参数:

#SBATCH --job-name=hellompi
#SBATCH --output=hellompi.out
#SBATCH --ntasks=56
#SBATCH --partition=broadwl
#SBATCH --nodes=2
#SBATCH --exclusive
#SBATCH --time=00:20:00

proxy

proxy server :
https://github.com/tinyproxy/tinyproxy
默认端口 8888,后台运行

ssh tunneling

local port forwarding :
本地命令:
ssh -L 8181:192.168.0.135:3389 pi@192.168.0.135
此时连接本地 localhost:8181 相当于连接 192.168.0.135:3389 且只有 localhost:22 的连接通过防火墙

dynamic port forwarding :
本地命令:
ssh -D 8181 pi@192.168.0.135
设置本地代理为 localhost:8181,把本地所有流量传到远端

remote port forwarding :
本地命令:
ssh -R 8181:localhost:3389 pi@192.168.0.135
将本地 3389 端口传输至远端8181端口,远端通过连接 localhost:8181 可以连接本地 3389 端口

cmd 使用 ss 代理:

set HTTP_PROXY=socks5://127.0.0.1:10808
set HTTPS_PROXY=socks5://127.0.0.1:10808

网关:连接不同类型的网络

route -n #查看路由表

修改网卡设置:/etc/network/interfaces

auto lo
iface lo inet loopback
auto eth0
iface eth0 inet dhcp

arp : ip 和 mac 映射表

arp -a #查看 arp 表缓存
arp -d #删除 arp 表缓存

arp 欺骗:

sudo arpspoof -i [网卡] -t [目标ip] [网关ip]

nmap :

nmap -sP 192.168.40.0/24 #扫描网段中的 IP

VMware :
桥接模式:与主机处在同一网段,虚拟机拥有独立 IP,所有虚拟机可以和主机相互访问