1. 最近工作的一点思考

    最近一周处理了一个ios-http代理引流方面的问题,从上周写完一点代码后,结果这周几乎都在联调测试改bug,好像一下子回到几年前刚开始工作有点懵懂打杂的状态了。突然有了危机感,好歹也工作好几年了,感觉是不是陷入了一种“工作一年,copy N年”的状态中了。反省一下:

    2018/06/29

  2. BGP多实例

    Cisco ASR9000系列路由器

    2017/03/31 network

  3. code complete笔记

    项目风险最常见的是需求分析和项目规划,前期工作如果没有做好,接下来只会更痛苦。程序猿大部分不能做好需求分析,只想尽快编码,这时候可以想想那些听到或是见到或是经历过的失败项目来让自己冷静一下,克制编码的冲动。

    2017/01/18

  4. BGP性能问题

    这次修订BGP的性能问题,有必要总结记录下,之前做过的工作,都没有好好记录,结果现在都快四年了,感觉好像刚刚工作一样,没什么经验。 这次修订的起因,是一个比较重要的客户A提出来要在keepalive/holdtime较短的情况下,至少要建立N百个个邻居,容量是Nw普通路由/ECMP路由。之前的BGP还从没有达到过这个性能指标;而且实际测试时,N百个邻居目前都不能正常稳定地建立起来,遇到holdtime超时而造成各种邻居down,这样会恶性循环下去;本身当前实现的BGP标的就没有支持这么大容量的邻居/路由,因此需尽可能解决。 其实问题的本质是当前的zebos框架使用的是伪线程机制,即单线程机制,多核多CPU根本不能有效利用到。而在当前的单线程机制下,想要让整个协议顺畅运行起来,最有效的方式就是把之前的耗时线程拆分出来,放在多个伪线程里面执行,好让其他task能够及时得到调度,特别是像BGP协议这种具有保活报文机制的进程—-一旦邻居没收到保活,认为你死了,立马就断开了邻居。 从本质上思考,邻居报文的接收/发送,不能与路由的计算分发放在一个线程里面执行。前者具有时间敏感性,后者只有计算收敛性要求,二者没有强关联性,把他们放在一起抢时间片不是一种有效的设计。但是目前还是需要从当前框架出发,短期内不可能对整体框架大动手脚。 先分析罗列出在满足当前场景下可以使用的性能调优方法,结合之前对代码的理解和分析: 伪线程运行时间切片 需要提取当前耗时较长,影响较大的伪线程事件进行拆分,拆分需要注意伪线程间的影响。 链表—> hash 之前的某些结构使用链表的方式组织,一是因为大部分行为都是遍历操作,二是要求组织是有序,三是之前可能没有考虑过大容量的情况。这对于查找来说是个灾难,每次都要进行O(n)的遍历也是够受的。因此考虑新增hash结构,专门针对查找做优化。 一次执行 —> 批量执行, 由此引发的异步逻辑影响考虑。 这个其实就是上面说的伪线程拆分,这里是着重强调本来是一次行完成的事件,在分成多个伪线程之后,对于本来A->B的事件流,需要考虑A1->B->A2->B类似这种逻辑的影响。 自己计算定时器时间: 虽然伪线程也有做定时器的时间计算,但是都是在事件队列执行完成后才能执行这个计算,这样时间上可能已经来不及了,所以把定时器计算单独拎出来,在每个事件完成后都计算一次,这样保证时间能够及时计算出来,报文能够及时发送出去。当然这个只是缓解的方式,如果一个事件 本身就花很长时间,那么定时器还是不能及时计算出来。需要配合其他的优化手段进行。 尽量拆线程,评估影响: 一个线程如果执行太多的处理,也会耗费较长时间,此时要考虑把一些事件处理挪到下一个线程去执行,这个与上述批量执行不同。即不要做成一个要处理很多事情的伪线程,不要一口吃成胖子,有些处理挪到下一个伪线程处理也是可以的。

    2016/09/10

  5. jekyll启动问题

    有好久没写了,今天启动jekyll,老是提示错误: F:\GitHub\anbenqishi.github.io>jekyll serve --trace Configuration file: F:/GitHub/anbenqishi.github.io/_config.yml Source: F:/GitHub/anbenqishi.github.io Destination: F:/GitHub/anbenqishi.github.io/_site Generating... done. Please add the following to your Gemfile to avoid polling for changes: gem 'wdm', '>= 0.1.0' if Gem.win_platform? Auto-regeneration: enabled for 'F:/GitHub/anbenqishi.github.io' Configuration file: F:/GitHub/anbenqishi.github.io/_config.yml D:/RUBY21-X64/lib/ruby/2.1.0/socket.rb:206:in `bind': Permission denied - bind(2) for 127.0.0.1:4000 (Errno::EACCES) google一下你就知道:http://stackoverflow.com/questions/28565086/jekyll-3-0-beta-on-window-7-permission-denied 问题应该是4000端口被人占用,懒得根据第一个答案来找出到底是谁占用的,直接根据解答二,先install wdm,再配置换个端口解决。 记录一下,免得以后出现问题又搞半天。

    2016/06/21 blog

  6. 数据库及实例的启动与关闭

    当一个实例启动后,Oracle将令此实例与制定的数据库共同工作。当数据库与实例关联后就称为这是一个mounted database,可以被open。

    2010/07/01 SQL

  7. Linux下使用Google Test C++

    昨天想找个C++的测试框架时,发现了Google开源测试框架。虽然没用过其他的C++测试框架,但作为一个G Fan,马上开工使用。不过昨天只是阅读了它的Primer,今天在Fedora 12下安装试用。 安装就是典型的configre make make install,这就不罗嗦。倒是安装完后,要记得进入/etc/ld.so.conf中添加路径/usr/local/lib,因为gtest的共享库就放在那呢,否则运行的话会提示说找不到某某库。 gtest的例子官网上都有给出啦,讲下注意事项:编译的话用的是这个命令: gcc $(gtest-config --ldflags --libs) -o xxx xxx.cpp 获得输出文件后, gtester [-o test.log] -k xxx 其中中括号里面的是可选的,如果你想要把测试结果保存起来的话。 你还可以参看这两篇文章: google开源测试框架的使用(一) google开源测试框架的使用(二) 然后就可以好好玩下这个框架了,具体请看这个玩转gtest系列教程: 玩转gtest 写下,方便查阅。

    2010/06/05

  8. gcc的头文件和库文件搜索路径[转载]

    include的header文件,连结数据库,系统定义,总共有下列来源指定gcc去那找。 当初在编译时指定的(在~gcc/gcc/collect2.c:locatelib() 写在specs内的 后来用-D -I -L指定的 gcc环境变量设定(编译的时候) ld.so的环境变量(这是run time的时候) 一、头文件 gcc在编译时如何去寻找所需要的头文件: 所有header file的搜寻会从-I开始 然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH 再找内定目录 /usr/include /usr/local/include /usr/lib/gcc-lib/i386-linux/2.95.2/include /usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g++-3 /usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include 库文件但是如果装gcc的时候,是有给定的prefix的话,那么就是 /usr/include prefix/include prefix/xxx-xxx-xxx-gnulibc/include prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include 二、库文件 cos()等函式库的选项要多加 -lm 编译的时候: gcc会去找-L 再找gcc的环境变量LIBRARY_PATH 再找内定目录/lib /usr/lib /usr/local/lib这是当初compile gcc时写在程序内的 三、运行时动态库的搜索路径 在配置文件/etc/ld.so.conf中指定动态库搜索路径(更改此文件需要执行ldconfig让其生效) 通过环境变量LD_LIBRARY_PATH指定动态库搜索路径(当通过该环境变量指定多个动态库搜索路径时,路径之间用冒号”:”分隔) 在编译目标代码时指定该程序的动态库搜索路径(还可以在编译目标代码时指定程序的动态库搜索路径。 这是通过gcc 的参数"-Wl,-rpath,"指定)。当指定多个动态库搜索路径时,路径之间用冒号”:”分隔) 默认的动态库搜索路径/lib 默认的动态库搜索路径/usr/lib 以下内容有缺失 可以通过执行可执行文件pos得到的结果不同获知其搜索到了哪个动态库,从而获得第1个动态库搜索顺序,然后删除该动态库, 再执行程序pos,获得第2个动态库搜索路径,再删除第2个被搜索到的动态库, 如此往复,将可得到Linux搜索动态库的先后顺序。 程序pos执行的输出结果和搜索到的动态库的对应关系如表1所示 程序pos输出结果 使用的动态库 对应的动态库搜索路径指定方式 ./ ./libpos.so 编译目标代码时指定的动态库搜索路径 /root/test/env/lib /root/test/env/lib/libpos.so 环境变量LD_LIBRARY_PATH指定的动态库搜索路径 /root/test/conf/lib /root/test/conf/lib/libpos.so 配置文件/etc/ld.so.conf中指定的动态库搜索路径 /lib /lib/libpos.so 默认的动态库搜索路径/lib /usr/lib /usr/lib/libpos.so 默认的动态库搜索路径/usr/lib 综合以上结果可知,动态库的搜索路径搜索的先后顺序是: 编译目标代码时指定的动态库搜索路径; 环境变量LD_LIBRARY_PATH指定的动态库搜索路径; 配置文件/etc/ld.so.conf中指定的动态库搜索路径; 默认的动态库搜索路径/lib; 默认的动态库搜索路径/usr/lib。

    2010/03/05

  9. linux 下glut.h使用

    linux下编写OpenGL程序的一些准备工作 需要用到的软件包有两个,glut 和tmake,分别可以从以下两个网址下载: http://www.opengl.org/resources/libraries/glut/glut-3.7.tar.gz ftp://ftp.trolltech.com/freebies/tmake/tmake-1.8.tar.gz 下载后的文件假设都放在/usr/src中 首先是安装glut库,以下是从www.linux.com找到的编译glut库的手册(http://www.linux.org/docs/ldp/howto/Nvidia-OpenGL-Configuration/instglut.html)。 Install GLUT 3.7 Distribution (optional) If you installed the MesaDemos/MesaLib package, then you have already installed GLUT 3.7 since it is included with MesaDemos. However, you may be interested in installing the GLUT manpages and you can skip right to the "Install GLUT manual pages", below ... Installing GLUT is a bit tricky. I'm not too familiar with imake, the program that it uses to manage the Makefiles, and didn't quite see how to get GLUT to install to where I wanted it (/usr/lib, but MesaDemos will do this without any trouble though). It can be done manually anyhow: cd /usr/src tar -xvzf glut-3.7.tar.gz cd glut-3.7 Read the file: README.linux cd linux READ the file: README cp Glut.cf .. cd .. Edit Glut.cf: remove any Mesa references. Replace any -lMesaGL -lMesaGLU with -lGL -lGLU if needed. In particular, replace: OPENGL = $(TOP)/../lib/libMesaGL.so GLU = $(TOP)/../lib/libMesaGLU.so with: OPENGL = -lGL GLU = -lGLU ./mkmkfiles.imake cd lib/glut cp /usr/src/glut-3.7/linux/Makefile . Edit the Makefile: remove any Mesa references. Replace any -lMesaGL -lMesaGLU with -lGL -lGLU if needed. In particular, replace: OPENGL = $(TOP)/../lib/libMesaGL.so GLU = $(TOP)/../lib/libMesaGLU.so with: OPENGL = -lGL GLU = -lGLU make (这里可能会遇到错误:“unrecognized command line option "-m486" ”,只要把Makefile里的-m486全换成-mtune=i486即可) ln -s libglut.so.3.7 libglut.so ln -s libglut.so.3.7 libglut.so.3 cp -d libglut.* /usr/lib cd .. cd gle # make a shared lib for libgle make gcc -shared -o libgle.so.3.7 *.o ln -s libgle.so.3.7 libgle.so ln -s libgle.so.3.7 libgle.so.3 cp -d libgle.* /usr/lib cd .. cd mui # make a shared lib for libmui make gcc -shared -o libmui.so.3.7 *.o ln -s libmui.so.3.7 libmui.so ln -s libmui.so.3.7 libmui.so.3 cp -d libmui.* /usr/lib # Install the GLUT manual pages (not included with MesaDemos) cd /usr/src/glut-3.7 make SUBDIRS=man Makefile cd man/glut make install.man ldconfig cd ../../progs/demos/ideas # edit the Makefile, change OPENGL = -lGL and GLU = -lGLU make ./ideas # test compiling some demos # take a look at which libraries have to be linked (-lX11 ...) in # the Makefiles. Qt's tmake program available at www.troll.no # is a quick way to make a Makefile but you have to edit it # and add the -l needed. ideas如果运行成功的话,说明glut已经可以用了。 (悲剧的是我并没有运行成功,出现错误了: ../../../lib/glut/libglut.so: undefined reference to `glXQueryChannelRectSGIX' ../../../lib/glut/libglut.so: undefined reference to `glXBindChannelToWindowSGIX' ../../../lib/glut/libglut.so: undefined reference to `glXQueryChannelDeltasSGIX' ../../../lib/glut/libglut.so: undefined reference to `glXChannelRectSGIX' ../../../lib/glut/libglut.so: undefined reference to `glXChannelRectSyncSGIX' collect2: ld returned 1 exit status make: *** [ideas] 错误 1 希望谁能帮忙解答下) 上面的几步中,下载的glut包放在/usr/src目录下,如果放在其他目录下,将/usr/src改为相应的目录即可。 此外应该注意的是两个Makefile文件的修改 改 · OPENGL = $(TOP)/../lib/libMesaGL.so GLU = $(TOP)/../lib/libMesaGLU.so 为 OPENGL = -lGL GLU = -lGLU 因为所指定的目录中没有libMesaGL.so和libMesaGLU.so。 之后是tmake的配置,后面我们可以用它来生成pro工程文件和makefile文件。 先将下载的tmake解压缩,tar -zxvf tmake-1.8.tar.gz 得到tmake-1.8目录,之后设置两个环境变量:PATH和TMAKEPATH PATH=$PATH:/usr/src/tmake-1.8/bin export PATH TMAKEPATH=/usr/src/tmake-1.8/lib/linux-g++ export TMAKEPATH 新建一个测试目录test,将glut-3.7目录下的progs/redbook目录下的hello.c复制到test目录中 之后生成一个pro文件:progen -o hello.pro 然后生成makefile文件:tmake hello.pro -o Makefile 编辑生成的Makefile文件,在加载动态连接库的行里面加入 -lglut -lXi -lXmu 保存,make。 ./hello 可以看到运行结果就可以了。

    2010/02/27

  10. 在openSUSE中安装vtk和itk

    真是泪奔,昨天刚装好openSUSE虚拟机,装了几个软件后,提示硬盘空间不足,然后就进入半死机状态了, 唉,当初只给它分配了10GB空间,想不到丫的是个空间大户,哭了,昨天的辛苦工作又白费了。但是还是把那些软件的安装过程记录下,省得每次都Google浪费时间。 导师主要是怕其他Linux的发行版中没有需要的东西,所以他建议把代码放在openSUSE里面运行,当然要运行之前, 一些必要的软件要安装,就是:QT、KDevelop、cmake、vtk、itk。由于openSUSE默认安装时有一些必要的软件没有安装, 所以在安装上述软件之前,确保以下软件已经安装在机子上了(在YAST2里): automake autoconf g++(gcc套件) libtool 其中KDevelop和cmake都可以从YAST2里面下载,所以较为方便,其他三个分别从官网下载即可,当然我们这里用的都是opensource的版本。 QT的安装http://www.qtcn.org/bbs/read.php?tid=22600 进入下载页面:选择下载用于 Linux/X11 的 Qt 库 4.6.2 (160 Mb) # tar -zxvf qt-everywhere-opensource-src-4.6.2.tar.gz # cd qt-everywhere-opensource-src-4.6.2 //这里可以把文件夹重命名为简单一点的名字,比如qt # ./configure # gmake # gmake install qt-x11 被安装到此目录下/usr/local/Trolltech/Qt-4.6.2 设定环境变量,在自己的家目录下的.profile或在/etc/profile中,添加下列代码(推荐在/etc/profile中): QTDIR=/usr/local/Trolltech/Qt-4.6.2 PATH=$QTDIR/bin:$PATH MANPATH=$QTDIR/doc:$MANPATH //这个不设也可以 LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH export QTDIR PATH MANPATH LD_LIBRARY_PATH (另:装了几次QT,每次装完再重启后系统就变慢了,郁闷,不知道什么原因) 使用KDevelop的步骤http://www.100ksw.com/jsj/linux/xxjc/178745.shtml: 新建一个工程 写代码 Build->Run Automake & friends Build->Run Configure Build->Compile File Build->Build Project Build->Execute Program(Shift+F9) 注意:在 4.Build->Run Configure 这一步中很有可能会出现这个问题configure: error: C++ compiler cannot create executables 这是kdevelop自身环境变量的设置问题。   在kdevelop中开启Project Options,然后在Configure Options的内容中,分别确认C和c++使用compiler,在各自的Compiler command(cc)和Compiler command(cxx)中分别填入gcc和g++.在对话框里面按下OK之后, IDE会问你是否要重建,选rerun即可。 (还有可参考此文) vtk和itk的安装(以前自己整理的,参考了网上的一些文章): itk篇: 在http://www.itk.org/ITK/resources/software.html中下好源码包 如果你想在全局安装,也就是安装在/opt或者/usr目录下,那么需要root权限.这里假设你要安装在自己的家目录下。 新建一个文件夹itk,再在这个目录下创建两个文件夹,分别是src,bin 把1中的压缩包解压到src目录下,这里假设解压出来的是InsightToolkit-3.16.0文件夹 cd进入到bin目录下,运行ccmake ../src/InsightToolkit-3.16.0/ 按c,把BUILD_EXAMPLES和BUILD_TESTING个OFF掉,不然耗时过长,个人认为可以把BUILD_SHARED_LIBS ON,主要是预防一下,要是有用到再重来一次就悲剧了。若没出错则继续按g就退出了 make (这个时间长点) make install (这个很重要,切记切记,网上很多都没有这步) 搞定以后就可以测试是否安装成功,步骤如下: 在/src/Example/Installation目录下,有测试的程序HelloWorld.cxx,带有CMakeLists.txt,把这两个 文件拷出来到一个文件夹中(可以随便新建一个) 终端下cd 进入到这个文件夹中,运行 ccmake ./ 这个可以设置itk的路径,在ITK_DIR这个选项填入你的bin路径,即类似XXX/itk/bin 按c,无出错,再按g退出 cmake . make ./HelloWorld 如果输出正常就说明安装成功了。 (补充一个,不知是否必要 ,反正没损伤: export LD_LIBRARY_PATH=/usr/local/lib/InsightToolkit 还有在/etc/ld.so.conf里也添加路径 /usr/local/lib/InsightToolkit ) (发觉这篇文章讲得也蛮清楚的:) vtk篇: 在http://www.vtk.org/VTK/resources/software.html中下好Source and Data两个包 新建一个文件夹vtk,把上面两个包解压缩到此处,同时再建一个文件夹bin. 在终端下cd到这个bin目录下 运行 ccmake ../VTK (这个VTK就是刚才从Source中解压出来的,文件名最好不要变)根据提示进行操作,一般默认的就可以了,下面是一些选项的解释: build_examples:询问是否编译vtk中的例子 build_testing:就是vtk开发者用来测试vtk代码的一些例子,我们常通过它们和Example下的例子学习vtk,是否编译它们,看个人喜好 build_shared_libs:如果设置为off,则只声称lib文件,用于c++开发是够了;如果设置为on则将多声称dll文件,在同时要使用python脚本调用vtk程序时,就必须编译生成动态库,要设置为on cmake_install_prefix:这个比较重要,就是以后要安装vtk的路径。有些人又要问,我编译完了不就可以用vtk了吗,为什么还要安装?对,不安装其实可以,安装的好处就是可以从 1G多的文件中提取出.h .lib .dll等精华,安装在指定目录下,并修改系统环境变量 vtk_data_root:一般地,cmake可以自己找到vtkdata的路径,但如果没有,把vtkdata路径填上即可,告诉cmake,vtk需要的数据都在哪里 按c进行配置,没出错,按g就可以退出来了。 make (花时间的说) sudo make install (sudo就是说要在root权限下,按提示输入密码即可) sudo export LD_LIBRARY_PATH=/usr/local/lib/vtk-5.4 往/etc/profile里添加如下查找路径: C_INCLUDE_PATH=/usr/local/include/vtk-5.4:$C_INCLUDE_PATH export C_INCLUDE_PATH CPLUS_INCLUDE_PATH=/usr/local/include/vtk-5.4:$CPLUS_INCLUDE_PATH export CPLUS_INCLUDE_PATH 这是因为编译时可能会出现无法找到头文件的问题,而C/C++的头文件查找路径包含有/usr/local/include,但不会继续进入子文件中,即不会去查找/usr/local/include/vtk-5.4.最后在/etc/ld.so.conf里也添加路径/usr/local/lib/vtk-5.4. 暂时就这些,继续搞系统!

    2010/01/25