参考:
- http://syscalls.kernelgrok.com/
- http://www.ibm.com/developerworks/cn/linux/l-system-calls/
- https://en.wikipedia.org/wiki/System_call
/usr/include/asm/unistd_64.h
DevOps
参考:
/usr/include/asm/unistd_64.h
测试脚本:
1 2 3 4 5 6 7 8 9 |
<?php echo "mem size:" .memory_get_usage(false)."\n"; echo " mem :" .memory_get_usage(true)."\n"; $a = str_repeat("H", 60 * 1024); echo "mem size:" .memory_get_usage(false)."\n"; echo " mem :" .memory_get_usage(true)."\n"; unset($a); echo "mem size:" .memory_get_usage(false)."\n"; echo " mem :" .memory_get_usage(true)."\n"; |
Nmap、Netcat、Hping3
在网络安全领域,Nmap、Netcat、Hping3都是安全工程师必备的工具。Nmap主要作为端口扫描器,侦查目标机的端口及服务状态;而Netcat则整合了网络中各种常用功能(如后门、文件传输、端口扫描、端口转发等等),能辅助完成丰富的操作;Hping3主要作为特定的TCPIP数据包产生与解析的工具,当然也可用于Ping操作。
参考资料:
systemtap依赖的debuginfo可以从这里(http://debuginfo.centos.org/6/x86_64/)找到,如果幸运的话,你可以直接yum install kernel-debuginfo kernel-debuginfo-common来安装;
不过,正确的安装姿势应该是:
话说systemtap是一个非常强悍的linux调试工具,但是似乎并不是特别的常用,今天尝试用了一下,确实有一些心得。
1 |
yum install systemtap |
然后就有systap命令了,弄个脚本试试跑跑吧:
1 |
stap -e 'probe begin { log("hello world") exit() }' |
有错误了:
1 2 |
Checking "/lib/modules/2.6.32-431.el6.x86_64/build/.config" failed with error: 没有那个文件或目录 Incorrect version or missing kernel-devel package, use: yum install kernel-devel-2.6.32-431.el6.x86_64 |
大致如上,可能版本号有所差异;好歹有提示,那就照做;不过,可能你确实已经安装了对应版本的kernel-devel; 你们不防rpm -ql kernel-devel 看看安装到哪里了,如果是 /usr/src/kernels/2.6.32-431.el6.x86_64 那么不妨执行:
1 |
ln -s /usr/src/kernels/2.6.32-431.el6.x86_64 /lib/modules/2.6.32-431.el6.x86_64/build |
其实可以这样:
1 |
stap-prep |
该命令可以帮你安装需要的依赖,主要是kernel-devel 和 kernel-debuginfo; 关键是要安装指定的版本,版本错了不行,如果使用的是本地的yum源,可能找不到指定的版本号的包,这样可以修改为使用官方的yum源,这可能是一个比较慢的过程,因为kernel-debuginfo 大小可能超过1G;单从这个来看,该工具的使用成本还是不小的; 也很有可能你配置了debuginfo的yum源,但是没有enable,可以在yum时候临时enable一下,eg:
1 |
yum --enablerepo=*-debuginfo install kernel-debuginfo-3.10.0-327.13.1.el7.x86_64 |
安装完后再次执行:
1 |
stap -e 'probe begin { log("hello world") exit() }' |
果然有hello world输出,再来一个 profile.stp:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
global syscalllist probe begin { printf("System Call Monitoring Started (10 seconds)...\n") } probe syscall.* { syscalllist[pid(), execname()]++ } probe timer.ms(10000) { foreach ( [pid, procname] in syscalllist ) { printf("%s[%d] = %d\n", procname, pid, syscalllist[pid, procname] ) } exit() } |
1 2 3 4 5 |
probe udp.sendmsg { if ( dport == 53 ) { printf ("PID %5d (%s) sent UDP to %15s 53\n", pid(), execname(), daddr) } } |
参考资料:
出于各种需要,经常需要限速
调用第三方接口发邮件,经常会有很大的附件,当发送大量这类邮件时,就会将带宽占满。(第三方出口带宽还挺大)
nginx可以做http代理、tcp代理,而程序上设置代理也都比较方便,如果能在nginx上限速,会比较通用一些,目前发现有2个nginx限速模块:
但是目前还没有一个限制流量的模块
(注:这些模块提供的时间段为‘秒’是不够灵活的,应该允许指定n秒,参考限速方面知识的其他参数)
apache是一个老牌的web server,模块很多,果然有限速模块:
参考: http://serverfault.com/questions/540743/how-to-rate-limit-apache-server-on-ip-basis
注意: 一般来讲,这些模块都是针对下行进行限速,很少对上行也限速的;如果对上行也要限速,则未必好使。对于代理的情况呢?
参考文章: http://blog.serverfault.com/2010/08/26/1016491873/
haproxy 是代理,不是隧道,如果仅仅作为一个限速的隧道或许还不行
注意:有些限制策略是超过限制就加入黑名单,并且直接返回错误(或许这不是你想要的)
参考: http://wiki.squid-cache.org/Features/DelayPools
squid.conf 中添加:
1 2 3 4 5 6 |
acl only128kusers src all delay_pools 1 delay_class 1 3 delay_access 1 allow only128kusers delay_access 1 deny all delay_parameters 1 64000/64000 -1/-1 16000/64000 |
测试发现: 这个限速也是针对下行的限速,上行不限速
goproxy( https://github.com/elazarl/goproxy ) 是一个开发proxy的golang库,在此基础上开发自定义功能的proxy是很方便的
其他:
关于phpmailer的发邮件限速:
php 的curl限速:
http://php.net/manual/en/function.curl-setopt.php
CURLOPT_MAX_RECV_SPEED_LARGE
CURLOPT_MAX_SEND_SPEED_LARGE
http://m.blog.csdn.net/tianyaleixiaowu/article/details/74942405
参考: http://stackoverflow.com/questions/26204315/php-finally-block-aborts-on-autoload
Person.php
1 2 3 4 5 6 |
<?php class Person{ function __construct() { echo 'autoload Person..'."\n"; } } |
main.php
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<?php function __autoload($classname) { require("Person.php"); } try { throw new Exception("error1"); }catch(Exception $e) { throw new Exception("error2"); }finally{ echo "finnaly\n"; new Person(); // php 5.6 之前,该Person是不能new成功的;而且如果有后续逻辑也是不会继续执行的 } |
解决办法:
docker run -it 的这个选项是啥意思?
一半来讲,如果启动的1号进程是 /bin/bash (或者类似程序)的话, -i 是交互的意思,如果没有 -i 选项,/bin/bash 不需要交互就没事干,会立即退出,然后容器就会退出; -t是分配终端,如果没有-t ,则 docker attach 进去的话,就没法和/bin/bash 进行交互,当然,如果你压根儿不知道attach或者压根儿没用过attach的话,你可能永远不知道这个-t有啥用;
所以说, -it 选项是和 /bin/bash attach 有直接关系
解决办法: https://injustfiveminutes.com/2013/03/13/fixing-ssh-login-long-delay/
ssh时候,服务器端可能需要进行域名解析,这个过程可能会比较慢,抓包如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# tcpdump -i em1 -nns 0 -A port 53 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on em1, link-type EN10MB (Ethernet), capture size 65535 bytes 15:23:53.796964 IP 172.16.158.4.53333 > 172.16.10.4.53: 39340+ PTR? 6.158.16.172.in-addr.arpa. (43) E..G8v@.@......... ..U.5.3.n.............6.158.16.172.in-addr.arpa..... 15:23:53.812602 IP 172.16.10.4.53 > 172.16.158.4.53333: 39340* 1/0/0 PTR rd.i.bbtfax.com. (72) E..d..@.=.=`.. ......5.U.P8..............6.158.16.172.in-addr.arpa..................rd.i.bbtfax.com. 15:23:53.812789 IP 172.16.158.4.35330 > 172.16.10.4.53: 45453+ A? rd.i.bbtfax.com. (33) E..=8w@.@......... ....5.).d.............rd.i.bbtfax.com..... 15:23:53.815068 IP 172.16.10.4.53 > 172.16.158.4.35330: 45453* 1/0/0 A 172.16.158.6 (49) E..M..@.=.=w.. ......5...9.u.............rd.i.bbtfax.com..................... 15:24:15.885444 IP 172.16.158.4.48327 > 172.16.10.4.53: 37753+ A? rd.i.bbtfax.com. (33) E..=8x@.@......... ....5.).d.y...........rd.i.bbtfax.com..... 15:24:15.885454 IP 172.16.158.4.48327 > 172.16.10.4.53: 20854+ AAAA? rd.i.bbtfax.com. (33) E..=8y@.@......... ....5.).dQv...........rd.i.bbtfax.com..... 15:24:15.887635 IP 172.16.10.4.53 > 172.16.158.4.48327: 37753* 1/0/0 A 172.16.158.6 (49) E..M..@.=.=w.. ......5...9...y...........rd.i.bbtfax.com..................... 【这里上下两个数据包时隔5s】 从数据包上来看,dns server是有响应的;但是,仔细看才发现,client问了两个问题,而dns server只回答了一个,难怪 client会等待 问题1: 为什么dns server不回答第二个问题呢?从下面数据包来看,dns server 也不是完全就不能回答 <em>AAAA?</em> 这个问题的 问题2: 既然都超时了,为什么client还敢用相同的端口号发送后续的问题?难道这样是安全的? 15:24:20.889731 IP 172.16.158.4.48327 > 172.16.10.4.53: 37753+ A? rd.i.bbtfax.com. (33) ......@.@.. ....5.).d.y...........rd.i.bbtfax.com..... 15:24:20.891864 IP 172.16.10.4.53 > 172.16.158.4.48327: 37753* 1/0/0 A 172.16.158.6 (49) E..M..@.=.=w.. ......5...9...y...........rd.i.bbtfax.com..................... 15:24:20.891924 IP 172.16.158.4.48327 > 172.16.10.4.53: 20854+ AAAA? rd.i.bbtfax.com. (33) E..=8{@.@......... ....5.).dQv...........rd.i.bbtfax.com..... 15:24:20.909039 IP 172.16.10.4.53 > 172.16.158.4.48327: 20854* 0/0/0 (33) E..=..@.=.=... ......5...)..Qv...........rd.i.bbtfax.com..... 15:24:20.909463 IP 172.16.158.4.48208 > 172.16.10.4.53: 10615+ A? rd.i.bbtfax.com. (33) E..=8|@.@......... ..P.5.).d)w...........rd.i.bbtfax.com..... 15:24:20.911779 IP 172.16.10.4.53 > 172.16.158.4.48208: 10615* 1/0/0 A 172.16.158.6 (49) E..M..@.=.=w.. ......5.P.9.=)w...........rd.i.bbtfax.com..................... 15:24:20.911838 IP 172.16.158.4.48208 > 172.16.10.4.53: 45448+ AAAA? rd.i.bbtfax.com. (33) E..=8}@.@.. ...... ..P.5.).d.............rd.i.bbtfax.com..... |
strace 的部分结果:
查问题的过程:
1 |
<strong>options single-request-reopen</strong> |
1. docker save 默认save该镜像的所有版本,而不是最新版本
现象:
cpu使用 接近100%
strace 跟踪结果
1 2 3 4 |
poll([{fd=9, events=POLLIN}], 1, 0) = 0 (Timeout) poll([{fd=9, events=POLLIN}], 1, 0) = 0 (Timeout) poll([{fd=9, events=POLLIN}], 1, 0) = 0 (Timeout) ... |
进程调用栈:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
Thread 3 (Thread 0x7fba3bdbe700 (LWP 31517)): #0 0x0000003967ee8ef3 in epoll_wait () from /lib64/libc.so.6 #1 0x00007fba3f043add in ?? () from /usr/lib64/libzmq.so.3 #2 0x00007fba3f06104b in ?? () from /usr/lib64/libzmq.so.3 #3 0x00000039682079d1 in start_thread () from /lib64/libpthread.so.0 #4 0x0000003967ee88fd in clone () from /lib64/libc.so.6 Thread 2 (Thread 0x7fba3b3bd700 (LWP 31518)): #0 0x0000003967ee8ef3 in epoll_wait () from /lib64/libc.so.6 #1 0x00007fba3f043add in ?? () from /usr/lib64/libzmq.so.3 #2 0x00007fba3f06104b in ?? () from /usr/lib64/libzmq.so.3 #3 0x00000039682079d1 in start_thread () from /lib64/libpthread.so.0 #4 0x0000003967ee88fd in clone () from /lib64/libc.so.6 Thread 1 (Thread 0x7fba49651700 (LWP 31457)): #0 0x0000003ea80695aa in ?? () from /usr/lib64/libpython2.6.so.1.0 #1 0x0000003ea80d72b7 in PyEval_EvalCodeEx () from /usr/lib64/libpython2.6.so.1.0 #2 0x0000003ea80d5a94 in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0 #3 0x0000003ea80d7647 in PyEval_EvalCodeEx () from /usr/lib64/libpython2.6.so.1.0 #4 0x0000003ea80d5a94 in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0 #5 0x0000003ea80d7647 in PyEval_EvalCodeEx () from /usr/lib64/libpython2.6.so.1.0 #6 0x0000003ea80d5a94 in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0 #7 0x0000003ea8060917 in ?? () from /usr/lib64/libpython2.6.so.1.0 #8 0x0000003ea80d1308 in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0 #9 0x0000003ea8060917 in ?? () from /usr/lib64/libpython2.6.so.1.0 #10 0x0000003ea80d1308 in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0 #11 0x0000003ea8060917 in ?? () from /usr/lib64/libpython2.6.so.1.0 #12 0x0000003ea80d1308 in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0 #13 0x0000003ea8060917 in ?? () from /usr/lib64/libpython2.6.so.1.0 #14 0x0000003ea80d1308 in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0 #15 0x0000003ea80d7647 in PyEval_EvalCodeEx () from /usr/lib64/libpython2.6.so.1.0 #16 0x0000003ea80d5a94 in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0 #17 0x0000003ea80d7647 in PyEval_EvalCodeEx () from /usr/lib64/libpython2.6.so.1.0 #18 0x0000003ea80d5a94 in PyEval_EvalFrameEx () from /usr/lib64/libpython2.6.so.1.0 #19 0x0000003ea80d7647 in PyEval_EvalCodeEx () from /usr/lib64/libpython2.6.so.1.0 #20 0x0000003ea80d7722 in PyEval_EvalCode () from /usr/lib64/libpython2.6.so.1.0 #21 0x0000003ea80f1b9c in ?? () from /usr/lib64/libpython2.6.so.1.0 #22 0x0000003ea80f1c70 in PyRun_FileExFlags () from /usr/lib64/libpython2.6.so.1.0 #23 0x0000003ea80f315c in PyRun_SimpleFileExFlags () from /usr/lib64/libpython2.6.so.1.0 #24 0x0000003ea80ff892 in Py_Main () from /usr/lib64/libpython2.6.so.1.0 #25 0x0000003967e1ed5d in __libc_start_main () from /lib64/libc.so.6 #26 0x0000000000400649 in _start () |
从调用栈来看,就算有bug也是libzmq的bug