Total Pageviews

Friday, 23 November 2018

跳出来看问题

我们都知道实验新药的时候首先要在实验大鼠身上实行,有些时候我们发现,明明在大鼠身上具有良好功效的药品,在人身上的临床效果并不明显。我们此时可能会从鼠和人类的基因的区别、体质等方面找原因,这是受过基本科研训练的人会有的正常想法:控制变量法。其实我们可能忽略了一个点,那就是,实验大鼠从小生活在无菌环境下,而人并不是。实验大鼠在无菌环境下出生和长大,并不会遇到某些细菌,自然不会建立起免疫机制,可与之类比的大概是人类婴儿吧。科学家们通过对比实验大鼠和农场中生活的野鼠,确认野鼠体质与成年人类更为接近,因此在实验新药的时候会更倾向于使用农场大鼠。这个案例告诉我们,遇到问题时,我们一般会从受到过的训练中获取方法,快速反应,去比对变量,但同时眼睛将固定于自己更想看到的部分,而没有跳出来看问题。在分析系统性能问题时,对某个瓶颈点百思不得其解时,这个时候是否可以把自己跳出来,多想想其他变量,甚至是其他更显得“弱智”的因素
有时候阅读一些技术文章时,会有这样一种感觉:这和理论不太一样啊。读林佩满的wireshark的书时,他分析过这样一个问题:某厂某个文件传输的产品在竞标时,发现大文件通过网络传输,从上海发往北京时很慢,需要很长时间才能将文件发送完成,而同时测试网速发现完全不是瓶颈,带宽利用率低到个位数;林在通过wireshark抓包时,发现有非常多的数据包被重传了多次,并且是毫无意义的重传;配管人员配置数据传送采用UDP方式,理论上讲不需要三次握手,且不需要发送确认的'UDP传输'更适合发送大文件,比如FTP协议就是基于UDP实现的,课本上都这么说。然而实际情况是,发送数据从上海到北京,会经过多多少少的中间结点,客户端发送较大的数据包,中途转发时,一些设备可能将大包拆成小包发送,对于UDP协议而言,如果最终小包里有一个包传输失败,那么需要将整个大包重传,而对于TCP协议而言,哪个小包没有收到,由于TCP头部的序号,客户端将只需要重传丢失的这个小包即可,避免了大量的无意义的重传;将传输方式改为TCP传输后,带宽利用率果然一下就上去了,这里我们的结论是远途传输大文件或大数据包时,TCP的性能由于UDP,这和课本上讲的很不一样。很多知识都不是一成不变的,会根据落地情况而调整、而改变,更有可能进化成不同形态。我想起前几天在火车上看到的一篇文章,城市里的灯光将会吸引虫子,趋光的虫子绕着灯泡一圈圈转,最后力竭饿死,这是个老知识了;而科学家经过实验,从城市和郊区抓取同样数量的飞虫,放在一个房间里观察,发现郊区的飞虫全部围绕着灯泡,而城市中的飞虫则有一小部分对灯光不感兴趣。科学家做出的结论是,城市中的飞虫有一部分进化出了不那么趋光的特性,基因得以保留。所以,我们看到,知识不是一成不变的,尽量做到不先入为主,从实际情况出发来分析问题。
说到实际情况出发,与一个朋友聊epoll在实际使用中会遇到的一些问题,对于多进程(线程)程序而言,具有父子关系的两个进程共享一个epoll fd,A进程通过epoll_ctl将fd添加进epfd的监听fd列表中,如果有fd有事件发生,发生事件的fd有的是A添加的,有的是B添加的,如果此时唤醒的是B进程,B进程将该epfd监听的所有有事件发生的fd取出,进行处理时,遇到有些不是自己添加的fd时,这个fd对B进程而言是无效的,如果不做处理,去read或者write它,可能会导致core dump,当然,我还没有自己做实验验证,但是理论上讲,这是会发生的。
在技术书之外,其实还有非常多的有趣的书,使人明事里、断情势,提升人的气质,这是一个大的范畴.

No comments:

Post a Comment