SDCC 2012 见闻感受

周末有幸参加了 SDCC 大会,基本"有用"比"无用" 一半一半吧。

第一天上午,没啥特别的,有点兴趣是腾迅的孙国政讲的《超大规模用户数据挖掘和推荐算法最新进展》,看题目以为讲的是腾讯自己目前数据挖据挖掘的进展,后来听着才发现,基本就是在介绍 KDD 大会。然后这个过程中有个比赛,叫 KDD CUP,有两个题目,track 1 倒是蛮有意思的,题目就是预测某个用户可能会 fo 哪些用户,就是做个推荐列表,推荐你感兴趣的人,去让你 folllow。很明显,twitter 也有这个,不过做的不是很好,推荐的推友我大多没啥兴趣,不过这是一年的情况,现在则改善了好多 :D
比赛这个东西大陆人最在行了,最后的获胜队伍也基本都是来自大陆。不够这题目起的太水了,两个 track 的数据量都不到 10G,这也算是大规模,还加了个超字?g 了下孙国政的一些背景,中科大 65 级校友,算起来估计有 6、70 岁了,真是老码农一枚了。

AMD 的那个基本是广告贴,不过深深的刺激我要联系英文听力的决心 -.-  电信的啥勃士基本就是在讲笑话让大家娱乐娱乐。

上午的至此结束,下午的含金量相对较高。由于每个人只有半小时,因此讲的都不是很详细,“泛泛而谈”,不过有个思路,开阔下眼界已经足够了。

先是讲腾讯的开放平台有多开放,里面很多技术都是换汤不换药,比如有个叫啥 TGW(tencent gateway) 的玩意儿,我理解就是个比较高级的防火墙,先在防火墙帮你把 TCP 建立起来,然后做转发,然后通过 OSPF 扩展。包括流量的自动切换等问题,这个貌似大公司都能实现了。

接下来是整个下午我觉得讲的最棒的一场,Twitter 来的中国籍工程师 @thinkingfish。气场十分的足,语速语调啥的配合的也是相当的好。介绍了 Twitter 的实时系统平台,官网竟然没找到报道,怕和谐?从 09 年讲起,流量大了,业务大了,从啥都挤在一台机器到模块化的思想,从 Ruby 切换到了 JVM 等等。后面主要还是介绍了 Twitter 开源的一些项目,包括 iago,好奇的是,竟然没有介绍那个现在看到就想吐的 bootstrap。在幻灯片的最后还看到了 Twitter 内部貌似在使用 chukwa 收集处理日志(?)
Continue reading

Android 使用 tcpdump 抓包

$ pwd
/opt/android-sdk/platform-tools

$ ll
total 20068
drwxrwxr-x 2 root root     4096 Dec 16  2011 lib/
drwxrwxr-x 4 root root     4096 Dec 16  2011 renderscript/
-rwxrwxr-x 1 root root   811728 Mar  7 15:07 aapt*
-rwxrwxr-x 1 root root   159620 Mar  7 15:07 adb*
-rwxrwxr-x 1 root root   164312 Mar  7 15:07 aidl*
-rwxrwxr-x 1 root root    97952 Mar  7 15:07 dexdump*
-rwxrwxr-x 1 root root     2603 Dec 16  2011 dx*
-rwxrwxr-x 1 root root    55776 Mar  7 15:07 fastboot*
-rwxrwxr-x 1 root root 18850844 Mar  7 15:07 llvm-rs-cc*
-rw-rw-r– 1 root root   377618 Dec 16  2011 NOTICE.txt
-rw-rw-r– 1 root root       33 Dec 16  2011 source.properties
Continue reading

Successful su for nobody by root 问题

/var/log/auth.log* 文件中出现了如下的条目:
Jul 30 06:52:59 jaseywang-pc su[3973]: Successful su for nobody by root
Jul 30 06:52:59 jaseywang-pc su[3973]: + ??? root:nobody
Jul 30 06:52:59 jaseywang-pc su[3973]: pam_unix(su:session): session opened for user nobody by (uid=0)
Jul 30 06:52:59 jaseywang-pc su[3973]: pam_unix(su:session): session closed for user nobody
Jul 30 06:52:59 jaseywang-pc su[3988]: Successful su for nobody by root
Jul 30 06:52:59 jaseywang-pc su[3988]: + ??? root:nobody
Jul 30 06:52:59 jaseywang-pc su[3988]: pam_unix(su:session): session opened for user nobody by (uid=0)
Jul 30 06:52:59 jaseywang-pc su[3988]: pam_unix(su:session): session closed for user nobody
Jul 30 06:52:59 jaseywang-pc su[4016]: Successful su for nobody by root
Jul 30 06:52:59 jaseywang-pc su[4016]: + ??? root:nobody
Jul 30 06:52:59 jaseywang-pc su[4016]: pam_unix(su:session): session opened for user nobody by (uid=0)
Jul 30 06:53:04 jaseywang-pc su[4016]: pam_unix(su:session): session closed for user nobody
Jul 30 06:53:05 jaseywang-pc CRON[27528]: pam_unix(cron:session): session closed for user root

并且是差不多每天这个时段出现,最开始以为是被 hack 了,后来排查发现其实是 cron 跑的 log 输出:
$ cat /etc/crontab
# /etc/crontab: system-wide crontab
# Unlike any other crontab you don't have to run the `crontab'
# command to install the new version when you edit this file
# and files in /etc/cron.d. These files also have username fields,
# that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# m h dom mon dow user  command
17 *    * * *   root    cd / && run-parts –report /etc/cron.hourly
25 6    * * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts –report /etc/cron.daily )
47 6    * * 7   root    test -x /usr/sbin/anacron || ( cd / && run-parts –report /etc/cron.weekly )
52 6    1 * *   root    test -x /usr/sbin/anacron || ( cd / && run-parts –report /etc/cron.monthly )

看来不要遇到不正常的情况就以为被 hack 了,SA 要镇静。

ref:
http://serverfault.com/questions/226110/entries-in-auth-log-are-i-am-not-sure-what-it-means

关于 traceroute/mtr 的一些说明

traceroute 默认发送的是 UDP 包,而非 ICMP,可以通过 -I 参数来使 traceroute 发送 ICMP 包,另外还可以使用 -T 参数来测试 syn 握手。
另外使用 -p 参数可以指定端口,对于 UDP 而言,每进行一个 probe 端口就会在原来的基础上加 1;而对于 ICMP 而言,可以用来初始化 icmp sequence 值,同样的,每进行一次 probe,sequence 会加 1。
对于 TCP 而言则指定发送的端口。

commandlinefu 上有一个使用 ping 来模拟 traceroute 的 shell,前面说了,ping 用的是 ICMP 而 traceroute 用的是 UDP,还是有点小差别的:

for i in {1..30}; do  ping -t $i -c 1 google.com; done | grep "Time to live exceeded"

默认情况下,traceroute 只发 3 次探测,可以通过 -q 参数改变此值。还可以通过 -f 指定 TTL。

除了 traceroute 之外,还有个叫 mtr 的工具,基本可以取代前者了,从 man 手册来看,默认应该使用的是 ICMP,可以通过 -u 参数来指定使用 UDP 报文。Debian 的安装包叫 mtr-tiny 之外,其余(CentOS, Arch) 都叫 mtr。

使用很简单,无非就是 -r, -n, -c 那几个参数。另外在执行 mtr 的时候,还可以通过 O 执行要显示的内容,默认从左到右为:
Loss%(丢包) Snt(probe 数量) Last(最近一次的 RTT) Avg(平均 RTT) Best(最短的 RTT) Wrst(最长的 RTT) StDev(就理解为方差吧)

跟 traceroute 一样,对于 loss 以及 latency 的分析,不能一概而论,这两篇文档(traceroute, mtr)分析的比较全面,可以参考。

简单总结一下 linode 那边文档的表述,traceroute 的那篇类似。如果只是某一个节点出现丢包,可能是由于路由限制了 ICMP 的流量;如果是从某个点开始接下去的几个点都出现不同程度的丢包,这个就可能是真正意义上的丢包了,可能是由于路由器撑不住了,或者直接把这部分包给过滤掉了,当然,由于去的包跟回来的包走的路由可能不一样,丢包可能是发生在回来的路上。因此最好的办法是 srs/dst 两边同时 mtr,不过这个一般情况下只有一方能实现,而另一方的控制权不在自己的手上。
尽管 TCP 有重传机制,当丢包达到一定的程度的时候还是会影响网路的性能,尤其在 latency 比较大的时候,如果 latency 比较小,比如在几ms之内,出现小部分的丢包也可以接受,但是如果 latency 本身就达到了 3,400ms,再来个 10% 的丢包,效果可想而知了。基本就是 latency 可以接受但是丢包律高就不可以接受了。
最能体现上面观点就是下面这张图,从北京某个 BGP 测试国外的某个节点的网络质量,白天 latency 以及 loss 逐步攀升,到晚上上网高峰期 latency 稳定在 500ms 左右,loss 一般在 10% 左右,峰值有 50%,并且 stDev 我理解的其实就是 jitter 了,也比较大。这时候网络质量就会有明显的下降,一般上网会受到比较明显的影响。