磁盘调度算法

参考: http://blog.csdn.net/theorytree/article/details/6259104

说明: 显示所有支持的调度策略, 方框内的是当前启用的调度策略

查看当前系统支持的调度算法:

难道调度算法和设备本身也有关系?从下面来看,阿里云的云盘不支持任何调度策略:

但是:

值得一提的是,Anticipatory算法从Linux 2.6.33版本后,就被移除了,因为CFQ通过配置也能达到Anticipatory算法的效果。

 

查资料发现, 调度策略为 ‘none’ 的现象和阿里云虚拟机没关系,和阿里云云盘没关系,和操作系统版本也没有(直接)关系,仅仅和内核版本有关系, linux内核从3.13开始引入 blk-mq 队列机制,并在3.16得以全部实现,上面看到的非‘none’的情况,内核版本都在3.10之前,为‘none’的情况是被我手动升级内核到4.4.61 的

如何验证是否启用了blk-mq机制?可以通过查看是否存在mq目录,如下:

目录不存在,说明没有启用该机制

存在mq目录,说明使用的是blk-mq机制

参考: https://www.thomas-krenn.com/en/wiki/Linux_Multi-Queue_Block_IO_Queueing_Mechanism_(blk-mq)

参考: http://www.cnblogs.com/cobbliu/p/5389556.html

块儿设备操作

centos中有rpm包util-linux,包含 blockdev命令(其实很多常用的命令都在这里),常见功能如下:

查看预读大小:(单位为扇区)

设置预读大小:

查询是否为只读:( 1 为只读 )

设置设备为只读:

设置设备为读写:

查看扇区大小: (一般都是512)

查看设备容量: (单位为 扇区 )

查看块儿大小: (单位为字节)

查看块儿设备综合信息:

其中:
RO: 是否只读
RA(read ahead):预读扇区数
SSZ(sector size): 扇区大小
BSZ(block size): 块儿大小

 

注意: 这里关于设备的设置在设备重新挂载后会失效,需要重新设置

 

参看: http://www.cnblogs.com/kerrycode/p/4743015.html

java core 调试

根据java core文件打印java堆栈信息:

 

java 之遗失的libjli.so

java 都用了N长时间了,突然,意外地发现有一个依赖的so文件从来没找见过

其实这个so文件在java的安装包中是有的,只是没有添加了ld_path 里面,解决办法:

然后,将/usr/java/jdk1.8.0_45/jre/lib/amd64/jli/  或 /usr/java/jdk1.8.0_45/lib/amd64/jli/ 添加到文件: /etc/ld.so.conf 中,然后执行ldconfig 即可

 

最后,libjli.so 是个啥玩意儿,为啥从来没找见过,却也从来没报错过?

制作openvswitch rpm包

openvswitch已经提供了rpm包的spec文件,所以制作openvswitch rpm包非常容易:

  1. 下载需要的源文件tar包
    http://openvswitch.org/releases/openvswitch-2.7.0.tar.gz
  2. 安装rpm-build
  3. 构建build环境(这里只创建了源码目录)
  4. 将源码包放入源码目录
  5. 从tar包中提取spec文件 (理论上rpmbuild -tb  openvswitch-2.7.0.tar.gz  可以自动搜索spec文件的,但是,该tar包中有多个spec文件,搜索到的未必是我们想使用的)
  6. 制作rpm包 (注意: 提示需要安装啥就先安装啥)

    make其实还是比较快的,主要是test过程长的要命

openvswitch 入门

openvswitch 安装,参考: https://phpor.net/blog/post/5102

启动相关进程:

创建数据库:

语法说明: ovsdb-tool [options] create [db [schema]]

默认数据库位置: /etc/openvswitch/conf.db

默认的表结构: /usr/share/openvswitch/vswitch.ovsschema   (schema 是一个很大的json)

 

启动ovsdb-server:

语法说明: ovsdb-server [database]…  [–remote=remote]…  [–run=command] –log-file[=/var/log/openvswitch/ovsdb-server.log]

默认数据库文件: /etc/openvswitch/conf.db

监听socket文件: 通过 –remote指定,可以是ip:port ,没有默认值

日志文件: 通过–log-file 开启日志,通过 –log-file=/var/log/ovsdb-server.log 来指定文件位置,默认位置: /var/log/openvswitch/ovsdb-server.log

 

通过ovsdb-client 操作数据库

ovsdb-client – command-line interface to ovsdb-server

默认的server socket文件: unix:/var/run/openvswitch/db.sock

 

加载openvswitch 内核模块:

如果不加载该模块,则ovs-vswitchd启动时会报错

该模块内核中已经有了,加载即可:

 

启动ovs-vswitchd:   ovs-vswitchd – Open vSwitch daemon

语法说明: ovs-vswitchd [database]

database 就是ovsdb-server listen的unix socket或ip:port ,这里默认位置为:  unix:/var/run/openvswitch/db.sock

日志通过 –log-file 打开,默认位置: /var/log/openvswitch/ovs-vswitchd.log

 

查看网络配置:

ovs-vsctl 通过

 

各组件之间的关系:

数据库文件是静态文件,如同sqlitedb,需要通过工具(ovsdb-tool)创建;对于mysql数据库,本身就可以直接提供网络服务,但是这里的数据库文件却仅仅是个文件,需要 ovsdb-server 来提供网络服务,ovsdb-server 只知道如何操作数据库(表),对网络却一无所知,但是ovs-vswitchd却是懂网络的,ovs-vswitchd 通过ovsdb-server数据库的变更,执行网络配置,提供一个配置网络的服务;ovs-vsctl 通过ovsdb-server (/var/run/openvswitch/db.sock)操作数据库

 

iptables 之 表、链

iptables中,target/jump决定了符合条件的包到何处去,语法是–jump target-j target

通过-N参数创建自定义链:

之后将BLOCK链作为jump的目标:

如下:

这样从INPUT链中匹配规则6的包都会跳入BLOCK链中,若到达了BLOCK链的结尾(即未被链中的规则匹配),则会回到INPUT链的下一条规则。如果在子链中被ACCEPT了,则就相当于在父链中被ACCEPT了,那么它不会再经过父链中的其他规则。但要注意这个包能被其他表的链匹配;

我们也发现了Chain BLOCK的引用数量为1,就是说有一个规则跳转到了这个链; -j 不仅仅可以是accept和reject,还可以是chain,正是这个才让自定义的chain生效的

为BLOCK链增加规则:

查看如下:

 

 

参考:

http://man.chinaunix.net/network/iptables-tutorial-cn-1.1.19.html    good

http://blog.csdn.net/yu_xiang/article/details/9218589    good

http://arster.blog.51cto.com/714732/908486     good

 

openvswitch 编译安装

参考: http://docs.openvswitch.org/en/latest/intro/install/general/

切记: 文档虽然稍微有点儿长,也最好先仔细(不要跳读)地看一遍,避免走一些不必要的弯路

命令:

  1. 检出源码
  2. 检出指定版本(这个是release的版本)
  3. 或者检出v2.7.x版本(这个是在release版本上修改了一些bug,但是没有release的版本
  4. 安装编译需要的软件

    其中:
    gcc >=4.6   autoconf >= 2.63   automake >= 1.10  libtool >= 2.4
  5. 安装python 2.7
  6. 安装 python six 模块
  7.  执行boot.sh (如果是下载的release的tar包,则不用执行boot.sh)
  8.  编译

centos7 安装python-pip

python-pip是在epel源里面的,默认没有安装该源,所以需要先安装该yum源:

然后,就可以直接安装python-pip 了:

yum源里面的东西一般都不够新,pip提供了更新机制,不放先更新一下: