Le's profileSomething like a home pa...PhotosBlogListsMore ![]() | Help |
|
October 12 apache performance tuninghttp://httpd.apache.org/docs/2.0/misc/perf-tuning.html 另外原来在gentoo里,如果不指定APACHE2_MPMS,但指定了threads USE flag,那么就会启用MPM worker. http://httpd.apache.org/docs/2.0/mod/worker.html October 11 如何查看一个listening socket的accept queue已满? 各位已经知道的不要笑话俺。这个惊天大秘密终于被我发现了,考! 看一看 Documentation/networking/proc_net_tcp.txt 00000150:00000000 01:00000019 00000000 | | | | |--> number of unrecovered RTO timeouts | | | |----------> number of jiffies until timer expires | | |----------------> timer_active (see below) | |----------------------> receive-queue |-------------------------------> transmit-queue 这个receive-queue就是:sk->sk_ack_backlog 具体的代码在:http://lxr.linux.no/#linux+v2.6.31/net/ipv4/tcp_ipv4.c#L2236 于是我终于大概明白了为什么我的gentoo-cn.org过一段时间就会连接不上…… 且看gentoo-cn.org上现在的80端口的sk_ack_backlog大小: $ cat /proc/net/tcp | grep 00:0050 5: 00000000:0050 00000000:0000 0A 00000000:00000081 02:0000000A 00000000 0 0 11883408 2 980000003eb4ad00 300 0 0 2 -1 注意粗体部分:0x81,就是129!正好大于128!!! 128是什么?128就是 /proc/sys/net/core/somaxconn, so max connections, 默认的accept q大小!!! 所以内核就会认为acceptq满了!!!http://lxr.linux.no/#linux+v2.6.31/include/net/sock.h#L539 所以后续连接最多只能处于SYN_RECV状态,而永远不会再有连接转成ESTABLISHED状态!!! 不过问题还没最终解决。因为目前我不能理解的是,为什么有129这么高。而且如果说是因为没有accept(),那服务器端也没有CLOSE_WAIT状态的连接。 啊!!! PS:发现apache配置中MaxClient为150,而目前有150个线程疑似处于死锁状态: #0 0x2acd4144 in __lll_lock_wait () from /lib/libpthread.so.0 #1 0x2accfbb8 in pthread_cond_destroy@@GLIBC_2.3.2 () from /lib/libpthread.so.0 #2 0x2bae081c in my_thread_end () from /usr/lib/libmysqlclient_r.so.15 #3 0x2b5b4808 in zm_deactivate_mysql () from /usr/lib/apache2/modules/libphp5.so #4 0x2b6f48a8 in module_registry_cleanup () from /usr/lib/apache2/modules/libphp5.so #5 0x2b6ffedc in zend_hash_reverse_apply () from /usr/lib/apache2/modules/libphp5.so #6 0x2b6f1e60 in zend_deactivate_modules () from /usr/lib/apache2/modules/libphp5.so #7 0x2b693d00 in php_request_shutdown () from /usr/lib/apache2/modules/libphp5.so #8 0x2b78aa84 in ?? () from /usr/lib/apache2/modules/libphp5.so 案情渐渐明朗…… PPS: 果然,杀掉其中一个进程(含27个线程,其中有25个死锁),就可以访问了。 我猜测apache在select()返回后,先创建线程,然后在线程中accept()。 但是现在线程总数的限制已经达到。所以无法创建新线程来accept()。 同时由于某目前尚未了解到的原因,原来的ESTABLISHED状态的连接也没了。 为解决这个问题,眼下之计,要加入debug信息重新emerge apache。 好在我有debugemerge脚本,哼哼。 然后在下次问题再重现时,再分析为何死锁。 不能学hw,明明缺少信息,还白耗时间在上面,硬要找出原因。 这个活就是出卖自己的时间啊 和其他工作仅出卖上班时间不同,这份工作是要随时准备好出卖任何一段时间段的时间。 除非你确实因故不能打开手机。 比如在飞机上…… October 08 it appears to not be an entirely attractive professionhttp://lwn.net/Articles/355416/ 最近的Real Time Linux Workshop上有个讨论,有关开发者和学术界的关系。中间提到如何鼓励学生参与社区的开发。但同时提到,如果学生根本就不想参与社区开发,那所有鼓励措施都是没用的。而且: As strange as it seems, it appears to not be an entirely attractive profession. It takes years of work to become a competent engineer; many are simply unwilling to put in that time. Whether things have gotten worse because people expect instant gratification now, or whether it has always been this way was a matter of debate. One panelist suggested that things will only get better when good engineers make more money than good lawyers. October 02 见过大爷September 27 今天尝试做了两件事一件未完成,一件基本完成。 基本完成的是升级ps3上的gentoo的内核到2.6.30。 不过发现有个bug,现在git clone ps3的git tree,看看是否还有。还有的话,我的内核补丁又要多一个了。 未完成的是一个诡异的2f盒子上的bug。 如果单启动X,然后再起一个firefox/pidgin,X就会死掉。再起xterm没事。 本来以为是X的补丁的问题。 后来发现startx没事。 后来发现死的原因是X的main里的无限循环里一个循环结束了,又开始了一个新的循环。 又一次执行了InitOutput,这里面最终会再次映射sysfs里显卡的resource文件到X的地址空间。 但实际上已经映射过了,libpciaccess在这种情况下会返回错误EINVAL。 因为我对X的工作机制还不完全了解,所以目前无法断定问题在哪里。 现在先记录一下,有空再来看。 明天要上班,调休。 国庆放11天假,但有两天是“强制”放掉的年假,囧…… 中国特色…… September 19 深圳自由软件日归来今天! 今天是一个繁忙的日子! 首先是准备演讲稿。 然后华为找我问问题。 然后去找莫老师吃饭,但是因为华为的事情耽误了,我到了吃饭的地方已经吃完了。 然后wjj载我去深大参加自由软件日活动。 jx和莫老师同行,在深大照了像。然后莫老师就去赶飞机了。 真是不好意思,老人家好不容易来一趟,我却没赶上跟老头子吃顿饭。 然后就是自由软件日活动。 原来这次活动主要是Sun赞助的。 深大的java学会搞的。Szlug协助。 4个演讲: 1. JavaFX 2. 原计划是gentoo,临时改成一个讲根据哼唱搜索歌曲的(主讲人非我,其实本来我很期待的,因为有别人肯讲gentoo,说不定真有世外高人) 3. AlacrityVM http://groups.google.com/group/szlug/msg/9a7881a931f183ea 4. iRedMail http://groups.google.com/group/szlug/browse_thread/thread/e5cb65b4c62cb541 不是自买自夸,不过后两个才真正像自由软件日上应该出现的演讲。 前面两个几乎没有互动。后两个讲者和观众的互动很多,特别是张煌彬的演讲。 我们两个都在讲述技术之外,穿插了一些自由软件的相关名词,自由软件社区的价值取向,行事方法的介绍。 相信对于不甚熟悉此道的听众来说,还是有些启发意义的。 这才是自由软件日应该起到的作用。 Last but not least,要感谢深大能提供聚会的场地,感谢lug众兄弟的捧场,感谢sun的赞助,嘿嘿 September 17 This is where I live in shenzhenSeptember 13 公开我的配置文件 说明:这是我自用的,顺便供大家参考(如果有需要的话)。 请不要照搬,除非你了解里面每个选项的意义。否则出了事情,我不负任何责任,:) 首批加入的有screenrc和vimrc。 我发现在华为,没有这两个东西,我的效率大减。 http://www.gentoo-cn.org/gitweb/?p=rconf.git git clone git://www.gentoo-cn.org/var/git/rconf.git AlacrityVM昨天从美国来的CTO/VP Moiz Kohari那里知道AlacrityVM这么个东西,还是蛮振奋人心的。 http://developer.novell.com/wiki/index.php/AlacrityVM http://lwn.net/Articles/345296/ KVM和Xen虽然都不是Novell的,但Novell也有自己的东西,:) September 06 生于忧患,死于安乐舜发于畎亩之中,傅说举于版筑之中,胶鬲举于鱼盐之中,管夷吾举于士,孙叔敖举于海,百里奚举于市。 关于extern inline EDIT:更新了第四条 首先inline在任何gcc版本里应该都是有效的,只是要开优化 其次extern inline并不会导致函数不被inline,只是要开优化 第三extern inline和static inline是有区别的。引用Linus的解释: * "static inline" means "we have to have this function, if you use it but don't inline it, then make a static version of it in this compilation unit" * "extern inline" means "I actually _have_ an extern for this function, but if you want to inline it, here's the inline-version" 这意味着在使用extern inline的情况下,假如不inline该函数,则必须在其他编译单元里 定义该函数。否则就和函数未定义一样,undefined reference to ... 第四,gcc 4.3之后,应该使用__extern_inline(定义于<sys/cdefs.h>,非编译器关键字,仅适用于userland),否则在-std=c99或者gnu99的情况下,会出现函数多次定义。 参考: http://zhllg.spaces.live.com/blog/cns!956A48A2D7ED7265!231.entry http://zhllg.spaces.live.com/blog/cns!956A48A2D7ED7265!2816.entry 好好研究了一下前段时间那个Null pointer dereference漏洞 http://lwn.net/Articles/349999/ 所有的第一手资料都可以在上面的连接里找到。 简单分析一下: 首先,这个漏洞的起源在于部分协议的.sendpage函数指针没有初始化,为0。那么在sendpage系统调用到这个函数指针所指向的函数时,实际上就是跳转到0x0这个地址上去执行放在那里的代码了。只要能把你想执行的代码事先先放在那里,就行了。你想让你的代码做什么事情都可以。但最有吸引力的无疑是利用这段代码赋予当前进程root权限。直接赋予,因为是运行在内核态。这个漏洞利用的实质就是在用户态控制内核态将会执行的代码,这是核心所在。在2.6.23之前(不包括2.0)的内核里,实现起来没有任何险阻。但在2.6.23及其之后的内核上实现起来还要经历一个坎。 因为,就是为了防止此类问题的再次发生,2.6.23以后的内核有一个/proc/sys/vm/mmap_min_addr文件,里面定义了可以mmap的最小地址,默认是4096,也就是说0号页不可以mmap。那就没有办法往里面放东西了。 然而,如果有SELinux的话,在某些条件下,这个mmap_min_addr是不起效的,那样就可以映射0号页。或者如果没有SELinux,可以利用MMAP_PAGE_ZERO personality(这依赖于内核的另一个bug)。这需要一个可以以不exec一个独立程序的形式执行我们指定的代码setuid root程序。pulseaudio正是这样一个选择。具体过程如下:我们设定进程的personality,令其包含MMAP_PAGE_ZERO,然后再exec这个suid程序。因为有MMAP_PAGE_ZERO(bug即在此,suid程序执行前应清除这个personality),同时有root权限,所以需要且可以映射0号页。假如以exec独立程序的形式来执行我们执行代码,那么在映射0号页(因为有MMAP_PAGE_ZERO)的时候,因为root权限已经被丢弃(一般的安全常识,所以suid程序作者都会这样做),所以cap_file_mmap()函数就会失败,无法exec我们的程序。而pulseaudio可以通过-L选项来指定一个共享库来执行,无需exec,且pulseaudio进程本身已经映射了0号页。虽然只是只读,可执行,但我们可以重新映射为可写。 至于0x0处的代码的具体实现,在x86上就是jmp $8, 0x8处放置的就是我们指定的函数的地址。 总结一下这个漏洞利用程序的流程: 1. 假如是2.6.23或以后版本的内核,利用SELinux或者pulseaudio来映射0号页;2.6.23之前的内核直接映射。 2. 在0x0地址上放上我们的可以获取root权限的代码 3. 创建某个可被攻击的Domain的socket,并调用sendpage()(就是调用0x0处的代码)。此步之后即获得root权限。 4. exec /bin/sh 最后的话: 1. 这个漏洞仅仅是本地权限提升,且依赖SELinux和pulseaudio(当然不是只有pulseaudio,但应该很少) 2. SELinux还是有作用,SELinux里连接网络的进程无论如何不可以映射0号页。所以最危险的是没有启用SELinux同时装了pulseaudio的机器。 |
|
|