如何释放linux系统的cache

我们知道,linux会将文件尽可能的cache到内存里面,系统运行一段时间后,我们发现内存几乎被用完了,其实大部分是cache;而且,说实在的,真的没有必要去清理这个cache,内存真的不够用的时候,这些cache会自动释放的。

你们我们这人就是洁癖,就想把这些cache从内存中请出去,该用哪个命令呢?

我没有找到使用哪个命令,但是dd和rm可以做到:

  1. 如果cache使用了N个G,你们可以用dd创建一个N个G的大文件;这时候cache中的东西就被这N个G的文件给挤出去了
  2. 使用rm删除这个N个G的大文件;这时候cache中的这个N个G的大文件就被释放掉了,然后cache就空了,对应的内存就free了

 

通过drop_cache 实现:

 

Docker之Volume

情景

出于某种目的,docker容器挂在了外部的文件,而且期望当外部文件发生变化的时候,docker容器对应的文件也发生变化。

难道本来不是这样的吗?是也不是:

是:  echo “append info” >>/the/file    立即反应到docker容器内部了

不是: 通过vim编辑,添加一行,docker容器内部文件没有变化

分析: 应该是echo和vim有不同

当不知道的时候,结果就是: 有时候可以,有时候不可以,恶心不恶心

放狗搜索,这里说的详细: https://github.com/docker/docker/issues/15793

总结一下:

  1. docker (或者说linux mount)挂卷是基于inode的
  2. echo 是在原文件基础上修改文件的,没有改变文件的inode
  3. vim 编辑的时候改变了文件的inode; (上面文章有说,可以通过 set noswapfile来禁用此特性,测试不好使,字面来看也不太是这么回事儿,实际测试应如此设置: set backupcopy=yes)
  4. 其他编辑器也可能改变inode,有些也可以设置不改变inode
  5. sed 编辑文件默认也是修改inode的,可以使用-c选项避免inode发生变化

有解决办法吗?

只要想办法确保inode不变即可,如: 编辑文件的时候,先copy走,编辑完再cat 到原文件中。

什么? 你使用vim修改挂载的文件之后,docker容器中的文件立刻就变化了?

先确认下该文件的inode是否变化了(我不想去证明vim修改文件肯定会导致inode发生变化)

 

还有别的解决办法吗?

  1. 请确认必须挂在文件而不是也可以挂在目录。挂载目录的话,docker内外是完全同步的
  2. 如果挂载目录的话,目录中的软连接只能在挂载的目录内有效,如果软链的是其它目录的文件,则容器内外是不同的

关于挂载目录

如果容器内挂载了宿主机目录/home/phpor/test 到容器内部 /test , 现在创建目录 /home/phpor/test/taoyi ;然后在另一个终端容器进入容器/test/taoyi 目录, 这时候,如果宿主机上mv /home/phpor/test/taoyi /home/phpor/taoyi , 然后 创建文件 /home/phpor/taoyi/file ; 这时候,在另一个终端下对于原本已经进入 /test/taoyi 的回话将可以看到file文件

 

关于TCP之序号与确认号

 

  1. tcp序号是两个方向的,每个方向有自己的序列号
  2. 依次发出的两个tcp数据包的序号可能相同、可能加1、也可能加更多,规则:
    1. 如果上个数据包不需要确认,则下个数据包的序号不增加
    2. 如果上个数据包没有数据,但是也需要确认,如SYN,则下个数据包的序号加1
    3. 如果上个数据包有n个数据,则下个数据包的序号加n
  3. 确认号比较简单,就是要确认的数据包的序号加1
  4. 确认包可以是包含在响应的数据包中的
  5. 不是每个数据包都要对应一个确认包的,一个确认包可以确认好几个数据包的,如:
    1. 由于接收方buffer比较大(就是tcp的win比较大),发送方连续发送了3个数据包,这时候,接收方可以只确认最后一个数据包就足以说明前两个数据包都已经收到了

wireshark 问题包分析

问题包如下图:

138 数据包问题: 其实 138、139、140 三个包是在某个设备上因超过mtu值而被拆分的一个包; 138是首先被收到的一个子包,所以有此标识

140数据包问题: 其实从ip的标识头(序号自增)来看,140应该出现在139前面,所以说:Out-Of-Order (就是所谓的乱序)

139数据包问题: 从ip的标识头来看,139前面应该有一个数据包没被抓到(其实就是140),实际是迟到了那么几微妙; 也就是说,如果140数据包能赶到139前面,那么139和140的问题就都没有了

142数据包问题: 从tcp协议的seq来看,141和142是重复了; 从ip数据包来看,这不是同一个数据包的重传,至于为啥会重复ack,不知道啊!

 

问题: ip分包标识是在ip协议上的,这里的重组为什么是reassembled TCP Segments

Etcd初步

源码: https://github.com/coreos/etcd

说明:

  1. master分支可能还不稳定,使用最新的release分支(下面测试的是2.3.6)
  2. 源码编译需要下载100MB左右的源文件,包含依赖文件(如果是在新的golang环境上编译的话)
  3. 如果在etcd目录下go install的话,只编译安装etcd,不编译etcdctl;需要进入ectdetl目录下go install,才会有etcdctl; 基本上就这两个二进制文件了
  4. 直接下载编译的文件比较快捷,而且这里有最新的release的二进制文件: https://github.com/coreos/etcd/releases/
  5. https://github.com/coreos/etcd 下面有一些参考文档的链接

 

集群配置:

https://github.com/coreos/etcd/blob/master/Documentation/op-guide/clustering.md

 

集群实现方式有三种:

今天了解了DNS Discovery,其中:

  1. DNS server使用的是dnsmasq
  2. DNS配置
    添加文件: /etc/dnsmasq.d/etcd.srv.conf

    其中:_etcd-server._tcp.        _etcd-client._tcp.  都是etcd自动添加的
    _etcd-server._tcp.    用于server之间交互,使用 2380 端口
    _etcd-client._tcp.     用于client(如: etcdctl )发现server,使用 2379端口

问题:

上面的dns配置基本是可用的,目前发现的唯一问题是: etcdctl –discovery-srv  etcd.i.beebank.com 来工作时,期望srv记录中拿到的是域名,而不是ip;不过etcd –discovery-srv  etcd.i.beebank.com 却没有这种苛求; 解决办法,把上面的IP换成域名,然后对域名做解析,而且,同一个域名解析出来多个IP也是不错的

 

修改如下:

/etc/hosts

/etc/dnsmasq.d/etcd.srv.conf

 

今天的测试没有涉及认证,server端启动参数:

其中:

–discovery-srv: 用于服务发现

–initial-advertise-peer-urls: 告诉其他成员,通过这个地址来联系我(对于服务发现的时候似乎用途不大,因为dns上已经注册了呀)

–initial-cluster-token: 应该是加群的暗号,暗号对不上是不让进群的

 

测试点:

  1. 通过proxy进行读写
  2. 同时通过单个实例进行读写
  3. 通过etcdctl的–discovery-srv进行读写
  4. 其中一个实例死掉一会儿,重启后依然能读到死后写入的数据
  5. 集群中一个节点到另一个节点之间都不止一个长连接
  6. 稍后测试一个全新的节点接入会是什么样子

======= v3.0.4 试用 ======

server端通过srv记录发现时,如果srv记录中解析到的是域名,则不会发现该域名下的所有IP (这个行为和v2.3.6不一致)

client端通过srv记录发现时,如果srv记录中解析到的是多个IP:PORT, 则etcdctl会试图解析已解析到的IP而报错

所以配置可修改成这样:

看起来好恶心

mysql 之 sql_mode

sql_mode 之影响:

  1.  sql_mode=’ansi’; 则当插入时,如果数据超长,则截断插入;有时候,这不是我们想要的

总结:

  • sql_mode=’TRADITIONAL’; 可以避免很多不必要的意外;

    TRADITIONAL 等价于 下面一系列标准的集合
  • 注意: 与innodb_strict_mode的区别

实际应用:

  1. 可以直接在 /etc/my.cnf 中修改sql_mode,如下:(需要重启mysql)
  2. 如果不方便重启mysql,则可以在执行sql语句前进行回话级别的设置,如下:

    (每次连接后都需要执行,比较麻烦;对于长连接的场景,该设置的花费可以忽略)
  3. 设置全局sql_mode:

    注意:
    1) 需要有超级权限
    2) 对当前session无效;要么退出再进来,要么再设置一下当前回话的sql_mode
    3)  该设置重启mysqld就没了,最好在my.cnf 中写一下

参考资料:

小米2刷机体验

首先, 刷机程序是windows程序,为此特地找了个windows的笔记本,虽然刷机过程还算比较快,但是,放下那个dell的windows,拿起mac,立马感觉舒服了好多。

刷机教程: http://www.miui.com/shuaji-393.html

如果第三步没有看到自己的手机,很可能是没有安装对应的USB驱动,设备管理器中有一个设备是带叹号的,参考: http://jingyan.baidu.com/article/e4511cf32d40e82b855eaf5e.html

到现在刷机完成已有半小时了,手机依然停留在开机的MI字界面,估计是刷坏了;让他起着吧,我先睡觉去

早上醒来,发现居然起来了,MIUI7的界面,????????

很快我就把一些主要的配置弄好了,然后,我这个小米2 的老毛病又犯了:屏幕触摸没反应,按键中只有一个重启功能有效,郁闷。。。。

 

sshd 之登录用户限制

问题:

linux机器配置了ldap验证,但是,又不期望ldap中所有用户都能登录,只是想用ldap中的密码,你们有一种办法就是通过pam_listfile.so 来实现,第一次配置非常顺利,立马就生效了;后来不小心执行了authconfig-tui ,配置文件就被重新生成了,手动添加的配置就没有了,再次添加就傻X了,怎么也不生效,都快哭了,如下图/etc/pam.d/password-auth 的一部分,因为/etc/pam.d/sshd include了这个文件,就直接在这里添加了,下图是正确的配置,错误的配置为:第5行写在了第6行的下面;

或者第5行直接添加在/etc/pam.d/sshd 文件中也可以,但是要写到 auth include password-auth 之前,否则也是不生效

暂且不知道原因,浪费了很多时间,555555555555

更正: 图中的 item=ruser 应该为 item=user