-
git删除远端tag
git push origin :tagname
git push --delete origin tagname
-
每次read时的buffer size如何影响性能2
昨天的时候有个疑问, /proc/diskstats里面的第四列, 也就是reads completed是什么. 和iostat显示的tps对比之后, 确认了, read tps取的值和reads completed就是一个.
那应该就是说, read(fd, 1024000)的时候, 未必是一次”I/O request to the device”. 具体系统怎么处理read的, 继续学习.
下午更新:
在高手的指点下, 想通了. 至少在读文件(而不是裸设备)的时候, read(fd, 1024000)不是一次IO请求. 下面具体说一下:
如果文件系统的blocksize也是4096. readahead设置成16, 也就是16*512=8192字节, 2个block.
我们假设文件是顺序的.
我原来的想法
因为文件在磁盘中顺序存放的, 所以read(fd, 1024000)的时候, 一次性取1024000字节, 可以极大的减少磁盘IO次数. 但和测试下来的结果不符合, 所以很困惑.
现在的理解
OS在执行read file的时候,可不知道文件在磁盘中是顺序存在的,它需要在分析文件当前的block之后才知道下一个block在磁盘的哪里.
如果一次性读取1024000这么多字节, 非常有可能后面很多数据都浪费了. 所以每次IO操作时, OS还是按照readahead配置来读.
在
read(fd, 1024000)
的时候, 是250个block. 因为有readahead, 所以一次会读8192字节. 如果磁盘是顺序的, 那么就是需要1024000/8192=125次IO requests -
每次read时的buffer size如何影响性能
磁盘IO是比较费时的操作. 操作系统在每次读取磁盘的时候, 会认为接下来的文件内容可能在接下来很快再次读取,所以会预先就先读到内存中.
这样可以查看当前系统的read ahead的值, 单位是512 bytes.
blockdev --getra /dev/sda1
这样可以配置read ahead的值, 单位是512 bytes.
blockdev --setra 1024 /dev/sda1
简单的脚本测试一下:
echo 3 > /proc/sys/vm/drop_caches read1=$(cat /proc/diskstats | grep sda1 | awk '{print $4}') dd if=test of=/dev/null ibs=$@ read2=$(cat /proc/diskstats | grep sda1 | awk '{print $4}') echo $((read2-read1))
运行结果:
# blockdev --setra 256 /dev/sda1 # ./go.sh 4096 4194 # # blockdev --setra 128 /dev/sda1 # bash go.sh 4096 8233
疑问1
我是计算的 ‘reads completed’ 的差值.
This is the total number of reads completed successfully.
这个到底是指的什么?
系统调用的次数? 看上面的测试结果应该不是.
实际磁盘IO的次数? 也会有矛盾.疑问2
如果readahead是16(512 bytes), 16*512=8192
read(16384)的时候, 会有几次磁盘IO? 看reads completed的值, 8192和16384没有区别.
非疑问
st_blksize 是4096, 所以readahead一定要是8的位数.
-
docker内存限制不能用free来查看
这样可以限制容器中所有进程使用的内存数量
docker run -it -m 300M ubuntu:14.04 /bin/bash
但它是用cgroup来实现的, 在窗口中用free看不出来.
-
TODO
- kernel memory
- docker memory limit VS free. TO BE CONTINUED
- ipvsadm
-
见见朋友 打打球
就是想找点事情做, 所以约了周末找出晓军打羽毛球. 到了前一天又有些纠结,觉得路途遥远, 有些累. 不过一天下来, 觉得还是比宅在家里好多了. 出来见下太阳打个球出个汗扯个淡见一下很久很久不见的同学,生活才更意思一点.
PS, 骨科医生说了, 最好的坐姿是离桌子近一些,背上有个靠的,身体后仰. 不过最好还是站着. 所以我以后尽量站着工作吧.
-
栈帧中的一些概念 1
前不久想了解一下python中协程的概念, 看了greenlet源码. 看到slp_switch的时候, 里面是汇编语言, 搜索之后好像是需要了解栈帧的原理.
基础太差, 看了好多文章, 才明白了一点点.
- 一个栈帧是一个被调用函数的一段内存空间
- ebp指向栈帧的底部, esp指向顶部, 即当前指向的内存地址.
- 入栈操作: push eax; 等价于 esp=esp-4,eax->[esp]
- 出栈操作:pop eax; 等价于 [esp]->eax,esp=esp+4
一些文章:
- 46
- 47
- •