如何 mock 系统高负载
要想测试系统在高负载情况下的行为,能够稳定造出高负载就很需要,有时候不需要安装特定的工具也能造出来。
- 造出 CPU 繁忙的景象:
- 压缩随机数据流:
cat /dev/urandom | gzip -9 > /dev/null
- 更大,更大,更大:
| gzip -9 | gzip -d | gzip -9 | gzip -d > /dev/null
- 压缩随机数据流:
- 造出内存不够用:
- 在内存中 mount 一个 ramfs 文件系统,然后写文件
dd if=/dev/zero of=z/file bs=1M count=128
设定块大小和多少块。
- 在内存中 mount 一个 ramfs 文件系统,然后写文件
- 造出磁盘不够用:
- 把上面产生的文件复制几份。
Chef 的最佳实践
Chef 的最佳实践一文,即便只是看作 devops 的一些范式,也很有参考意义。
- 常见的部署模型有 推(ansible)和拉(chef) 两种风格。对于 chef 这种拉式部署,需要解决的问题是怎么快速在 host 上搞起来 agent。一个方案是 master 上提供 bootstrap 的方案,将 agent 的部署使用 ssh / WinRM 推到 slave 上。
- 配置和代码分离是部署的一个重要步骤。配置的几个关键点:代码中的默认配置,基于 role 的配置,基于环境的配置。由于环境可能差异比较大,配置设定应该要做到提供尽可能细的粒度以应对不同的场景。
- 将配置版本化存入一个中心设施,部署时可以选定选定的版本。
通配符 glob 语法简介
在很久以前,glob 是 UNIX V6 的一个程序,后来就被整合进 shell 成为内建功能。Globbing,就是将一些通配符扩展为一个路径的列表。跟正则表达式不同的是,?
表示任何单一字符,*
表示包括空格在内的任何字符。
* []
中间一定要有东西,用于表示字符集。 例如 [][!]
表示的其实是 [
, ]
, !
这三种字符。
* []
中间可以用短横线表示范围,例如 [a-ZA-Z0-9]
表示字符数字,[--0]
表示 -
, .
, 0
; []-]
表示 ]
, -
。
* []
中间用反斜杠 \
做转义。
* 两个设定:
* '/' 不会被 *
或者范围识别出来,因为这个程序是用来识别路径的。
* .
开头的文件需要显式指定出来,例如 rm *
是不会删除 .profile 的。
* 没有任何东西识别出来,对应的是空列表。
用 Select 之前想清楚
不要傻里傻兮地不分场合地用 select *
。出于性能原因,只要一块代码不是需要所有字段的数据,那么就不要用 select * from table
来获取数据,转而应该选定特定的字段 select field1, field2 from table
。
* 想想数据库怎么给你数据:通过index定位一行的地址,然后加载那一行所有的数据。如果索引优化的好,~~这个效率,efficiency~~数据库从索引就得到了所有信息,也就不需要再需要加载那一步了。一般索引一页存放100条记录,如果省去了一行一行加载,速度也就上去了100倍。
* 如果 SQL 语句里面有排序,那么数据库也需要更大的内存用于排序。最恶劣的场景里,数据要被转储到硬盘上做外部排序。
* 也要考虑 GC (垃圾收集) 的进程。
需要强调的是,你问我滋磁不滋磁 select *
,我当然是要滋磁啦。重要的是,不要无脑用,要考虑场景,想好了再用。