cgroup 学习

题记: cgroup早该学习了

缘起:

几十台虚拟机,没有资源限制,宿主机经常挂掉,不知道因为啥。

该看看cgroup了

  1. 上网查文档
  2. 安装:
  3. 配置
    /etc/cgconfig.conf 添加:

    注意: cpuset.mems = “0”;是需要的,否则不生效哦(稍后再看是咋回事儿)
    /etc/cgrules.conf 添加: (据说对子进程是生效的)
  4. 重启服务:

    cgconfig是配置服务, cgred是规则引擎daemon
  5. 测试:
    。。。 发现 /usr/bin/vagrant 启动的进程都放到了vagrant组中了,cpu只使用0、1,其他的都不会被用到
    修改配置文件后,重启两个服务,即可生效,可以立即影响到正在运行的进程

libcgroup 工作方式:

  1. cgconfig服务 其实是通过 /sbin/cgconfigparser 解析并load /etc/cgconfig.conf 以及 /etc/cgconfig.d/* ,把配置文件中需要mount的mount上去
  2. cgred服务其实是/sbin/cgrulesengd ;主要是listen /var/run/cgred.socket , 这个socket是个比较核心的东西,系统没启动一个进程(或者别的操作也会),就会通知到该socket,而/sbin/cgrulesengd就是要根据配置的规则把启动的那个进程添加(就是写一个文件那么的简单)到指定的cgroup中去
  3. 注意:
    1.  /sbin/cgrulesengd 的man中说他可以接收USR1信号,但是实际上把这个信号发过去,进程就直接死掉,连pid文件和lock文件都不会清理掉的
    2. 内存限制指的是对该组中所有进程占用内存之和的限制,oom触发在申请内存的时候,如果是后期加入的,不会在加入的时候触发oom; blkio 的限制也是组内共享的
    3. /cgroup/memory/memory.oom_control 为 1时 ,内存不够时不会杀死进程,但是申请内存的程序会hang住
    4. cgexec 不依赖cgrulesengd ,cgrulesengd偶尔会不太好使,比如:修改完配置文件之后忘记重启了,所以,建议直接使用 cgexec来测试
    5. 限制blkio时需要知道磁盘的主设备号和次设备号,查看方法: lsblk
    6. cgred 服务stop时,不会将添加到cgroup中的pid给移除掉,但是cgconfig服务stop时会移除所有的cgroup
    7. /etc/cgrules.conf 中controller部分的 ‘*’ 代表添加到所有的子系统中(如果配置了的话),但是测试发现,如果同时添加到cpuset,memory 子系统中,写 ‘*’  却只添加到了cpuset中了,明确些cpuset,memory 就好使(这种问题浪费了新人很多的时间)
    8. 当将进程加入某个group时,如果该进程没有在加入group之后发生内存(资源)申请时,则子系统的统计信息中是没有包含该进程的资源信息的,虽然该进程已经占用了很大的rss,内存子系统中的rss很有可能依然是零.(可能这根本就不是问题)

参考:

https://www.kernel.org/doc/Documentation/cgroups/memory.txt

http://www.cnblogs.com/yanghuahui/p/3751826.html

mkdir 之 mode

题记: 学习要细心

曾经,在php中要创建一个权限为 0777的目录:

应该问题不大,写完就交差了,测也不测;后来发现,创建的目录是 0755的,再检查一遍代码,确认是0777,不可能错的!可能是谁给修改成0755了吧?然后就做别的去了…

终于有一天,同事遇到了同样的问题,叫我过去看看,猜测可能和umask有关系,修改umask=0000(零零零零)后,终于创建出了0777的目录了,果然和umask有关系,有点儿坑die吧?

难道是PHP中添加了这种奇怪的逻辑? (写C的同学不要笑我,俺没写过C)

查看PHP源代码,发现PHP的mkdir直接调用的是glibc中的mkdir,没有做任何特殊处理,那么?

man 2 mkdir

有如下描述:

问题真相大白了。

我们知道命令行的mkdir -m 0777 能创建出来777的目录,难道命令行的mkdir用的不是glibc的mkdir?不太可能,参看: mkdir –help

很有可能mkdir在创建目录之后,chmod修改了目录的权限

神奇的cpu 100%

系统cpu占用 100% ,但是没有一个进程使用cpu很高,如下:

祭出 vmstat 看看吧:

in/cs 都很高

结果发现有类似下面的一个程序:

于是当 /tmp/my_test_file 不存在时,程序在拼命地”生孩子<=>死掉”;于是,你不知道那个进程占用cpu很高,你只知道cpu被用光了

阿里云SLB的tcp代理的一个测试

号称阿里云的SLB可以处理syn-flood攻击,如何实现的呢?

猜想:

阿里云的SLB在做tcp代理时,如果能在和client端tcp握手成功之后,再和后端服务器进行tcp连接,然后进行正常的服务,这样不就可以很好地避免后端服务器遭受syn-flood攻击了吗?

测试:

  1. 在A机器上添加iptable规则,drop掉所有SLB进来的数据包(就是为了drop掉syn-ack),避免成功创建连接
  2. 在A机器上抓包,在SLB后面的机器上抓包
  3. 从A机器向SLB发送请求
  4. 结果:SLB后端机器上可以看到syn请求

如果符合猜想,则:SLB后端机器上不会看到syn请求;事实上看到了syn请求,于是,不符合猜想。

结论: SLB在做tcp代理时,不会在和client握手成功之后才向后端服务器发起tcp连接的。(可能那样会比较麻烦,可能需要处理序号之类的东西)

对于一个高级的tcp负载均衡设备来讲,当接到client的syn包后,就先去连接后端,如果后端能连接,再syn-ack给client,这样逻辑上是好的

linux 之 mv

缘起

mv是多么简单的一个命令啊,但是,获取有些东西你真的不知道。

一个同事mv big_dir_of_small_file to_other_disk ; 明明看着目标地址的空间使用在增加,但就是不见源地址的空间使用在减少,为什么呢?

lsof 查了一下,移走的文件没有立即删除。那就应该是全部移完之后再删除了。

因为文件实在太多,如果中断了程序,会是什么结果呢?

猜测:

  1. 删除移过的文件,保留没有移动的文件
  2. 那么,移动一半的文件是删除还是不删除呢?

参看: http://lingrok.org/xref/coreutils/src/mv.c

解疑:

其实代码很简单,就是先copy,最后在删除,根本没处理执行一半时被中断做何处理;所以,如果中断的话,就是:copy多少算多少,不删除任何文件。

学点儿expect吧

几十台虚拟机需要修改root相关内容,只有一个普通账号的key,没有root的key,虽然普通账号可以sudo到root,但是脚本中的ssh使用sudo是不行的,于是,使用脚本生成一大堆命令行,手动粘贴执行,太low了

学点儿expect吧: http://www.cnblogs.com/iloveyoucc/archive/2012/05/11/2496433.html

 

 

 

nginx + fastcgi + php-fpm 配置

  1. nginx和php-fmp保持长连接的设置
    1. 参考: http://nginx.org/en/docs/http/ngx_http_upstream_module.html#keepalive
    2. 设置
      keepalive 8;  //数字自己定吧,只要大于0就行,但是没有就不行

      fastcgi_keep_conn on;

  2. 关于单个连接同时处理多个请求的情况:
    1. fastcgi的设计来看,单个连接是可以同时传输多个请求的;对于多线程或事件驱动型fast-cgi server 是有一定好处的
    2. 对于特定的fastcgi-server,比如: php-fpm是不会同时处理多个请求的,所以fastcgi的该特性对于php-fpm是没有用的
    3. 问题: nginx何以知道后端的fastcgi-server是不能同时处理多个请求的?没有找到相关的nginx配置来告知nginx能否同时发送多个请求给相同的后端fastcgi连接; 难道nginx只能同时在一个连接上只分发一个请求?

json in java

参考资料: http://www.cnblogs.com/lanxuezaipiao/archive/2013/05/23/3096001.html

测试IDE: Intelijj

坎坷:

  1. 按照文档,下载了json-lib-2.4-jdk15.jar
  2. 开始写代码 (忘记了下载其他的依赖了)
  3. 编译,没有问题
  4. 执行,类找不见
  5. 由于不熟悉,浪费了一些时间
  6. 解决办法:
    1. 把异常中找不见的类放在程序的上面import一下(当然,肯定没有该类),IDE会提示类找不见,但是提示中可以“find in web”
    2. 然后就“find in web”,下载后,继续允许,继续报“类找不见”(当然,是其它的类),继续步骤1,直到不再报错

 

输出结果: