【每日进步】May 2012

----------------------------------------------Tue May 8 2012--------------------------------------------

Ubuntu

1.重定向输出可以将stderr与stdout重定向到位置:$command > out.log 2>&1

2. gcc 编译时遇到cannot find -lssl,使用ldconfig -p | grep libssl可以找到ssl动态库,但是生成的符号链接不对,为libssl.so.1.0.0,重新创建符号链接libssl.so。

3. 编译maui.3.3.1时遇到如下错误MPBSI.c:177:12: error: conflicting types for ‘get_svrport’
/usr/local/include/pbs_ifl.h:681:14: note: previous declaration of ‘get_svrport’ was here
网上查了下,这是maui的一个bug,将MPBSI.c中的get_svrport 的prototype去掉即可

4. 按内存使用大小查看进程:ps aux | sort -k4n

5. sort -k 选项用于指定按哪列进行排序,上面命令的n为按数字方式排序,为简写。-k POS1[,POS2], POS为F[.c][OPTS],F为field,指定第几列(1开始),c为从第几个字符开始排序,OPTS指定排序方式。

 

Torque, Maui

1. 安装完后,pbs_server运行正常,但是pbs_mom运行时出错,查看log,错误为connection rejected,手动指定端口pbs_mom -M 15002 -S 15001后运行正常。

2. 使用pbs_sched为scheduler时,提交的作业无法运行,总是处于Q状态。之后改成maui,但job仍是Q 状态,查看maui.cfg 配置的ADMIN1为jujj,而作业也是使用jujj提交的,而maui默认不允许ADMIN1提交作业,修改为root,重启maui,运行正常。

3. 解决torque maillist里的一个问题,作业提交后处于Q 状态,checkjob提示no resources:提问者的queue配置里有个resources_default.neednodes属性,查看文档,并没有该属性,去掉并重启maui后,运行正常,这里重启maui是必须的。但是如果是修改合法的属性,修改后是不需要重启maui的。

----------------------------------------------Tue May 8 2012--------------------------------------------

Ubuntu

1. 查看内存使用一般使用free命令,需要注意的是,第一行的free部分并不是剩余可用内存大小。Linux的思想是,内存是拿来用的,不象windows,无论你的真实物理内存有多少,他都要拿硬盘交换文件来读。

free命令第二行-buffers/cache 指的是实际被程序占用的大小,+buffers/cache是实际可用部分。Linux使用buffers和cached部分来加快IO访问,以应用程序角度是可用内存,以OS角度是被占用的。

参考:http://ldbjakyo.iteye.com/blog/785623  

 

----------------------------------------------Tue May 8 2012--------------------------------------------

Ubuntu

1. make: *** Warning:  Clock skew detected.  Your build may be incomplete。由于编译时在NFS上进行,文件的修改时间可能会大于当前clock时间,导致makewarning

参考:http://www.linuxsa.org.au/pipermail/linuxsa/1999-August/008869.html    

gfortran,NPB

1. 编译FT时遇到编译错误relocation truncated to fit。网上搜索后发现当程序数据区申请空间大于2G时会出现这类错误,而编译服务器是64b机,这可以解释通,FT在classC 4进程编译时不会出错,但是2进程就会出错。解决方法是,添加选项-mcmodel=medium(gfortran下)。

以前多是在32环境下编程,后在64位环境下编写编译程序,还需要多注意。

参考:http://www.ualberta.ca/CNS/RESEARCH/LinuxClusters/64-bit.html  http://software.intel.com/en-us/articles/avoiding-relocation-errors-when-building-applications-with-large-global-or-static-data-on-intel64/ 

 

 

----------------------------------------------Mon May 14 2012--------------------------------------------

GCC,GDB:

1. LD_LIBRARY_PATH, LD_PRELOAD表示很有用的说

2. 使用64位编译时,所有相关文件都应该是64为编译,gcc中即都使用-fPIC

 

3. gdb中查看stack,args:info stack  info args

4. GCC printf optimization, GCC对printf的调用默认会进行优化,根据具体情况使用puts、putchar等替代printf以提高性能,如果需要禁止该功能,-fno-builtin-printf

参考: http://wolfie.stfu.cz/src/GCC_printf_optimization  
5. HOOK : dlsym, 所在位置dlfcn.h -ldl,引用前define宏_GNU_SOURCE

参考: http://www.linuxforu.com/2011/08/lets-hook-a-library-function/

6. 生成.a文件, ar rcs libxx.a xx.o; 生成.so文件, gcc -shared -o libshared.so ... 

7.  经过试验,GCC从左到右的符号搜索顺序,仅对.o 与.a有效 .o 间和.o 与.so无效

 

----------------------------------------------Tue May 15 2012--------------------------------------------

GCC:

1. gcc 查看预编译(preprocessing)后的输出使用-E,结果会打印到stdout 

2. 重写某个库,如libc的API时,除了可以使用HOOK,也可以用宏定义,如修改fopen:

先实现....myfopen(...),实现内可以调用fopen等libc库函数,然后写个头文件

#define fopen myfopen

使用新库的程序,只要引入该头文件即可

这样做相比HOOK的优势在于相关数据结构也可以进行修改:

定义struct File.....在头文件中定义如下:

#define FILE struct File

注意头文件的引用顺序是很重要的。

 GCC, ELF, PE:

1. An ELF executable lists the symbols it needs and the libraries it needs, but it doesn't record which symbol is in which library. A PE file, on the other hand, lists the symbols to import from each library. 这可以解释为什么如下程序会产生循环调用:

fopen.c

....fopen(..)
{
myfopen(..);
}
myfopen.c
myfopen(..)
{
fopen(...);// glibc version
}

main.c

int main()
{
fopen(...);
}
$ gcc -c *.c
$ gcc -shared -o libmyopen.so myopen.o
$ gcc -o test main.o fopen.o libmyopen.so
$ ./test

libmyopen.so内并没有将printf与libc绑定,当运行时会去寻找首先出现的符号,这里是main中的printf,从而产生循环调用

2.  The ELF scheme is definitely a lot more flexible. Since each executable names the "interpreter" program (now always the dynamic linker named ld.so) to use, different executables could use different interpreters without requring any operating system changes. In practice, this makes it easier to support executables from variant versions of Unix, notably Linux and BSD, by making a dynamic linker that links to compatibility libraries that support non-native executables.

参考: http://www.iecc.com/linker/linker10.html 

 

----------------------------------------------Mon May 21 2012--------------------------------------------

TORQUE,Maui:

1. 使用qsub提交的脚本作业,执行目录在用户home目录,但有时会用到脚本提交目录中的文件,如果脚本时sh脚本的话,使用:

cd $PBS_O_WORKDIR转到脚本提交目录

2. 查看作业状况,qstat  tracejob  checkjob(maui程序),qstat只能查看本用户的作业,查看所有作业,可以使用maui的showq查看

3. showq  showbf  showres可以查看资源占用和资源使用情况,showres -n查看被占用的节点

Linux:

1. 将stderr传给管道  <command> 2>&1 | <command>

2. 查看进程系统调用列表 strace,还可用来查看各调用统计信息,debug程序(在程序内容未知的情况下更有效)时,查看出错位置

3. 查看某用户使用  id

4. 写了个getuid  getuid的hook函数,想获得root权限。函数内直接返回0,使用LD_PRELOAD 运行,并没有获得root权限,这种方法看来不行

----------------------------------------------Mon May 21 2012--------------------------------------------

Linux:

1. xxd以hex形式查看文件 

2. 命令行浏览器 lynx links

TORQUE,Maui:

1. qsub 的-W在使用stagein stageout 时,对每个文件都要以stagein=/stageout=开头,即:-W stagein=localfile@remote:remotehost,stagein=.... 

 

----------------------------------------------Tue May 22 2012--------------------------------------------

 

Intel,Linux:

1. 获取Intel CPU 拓扑结构,Intel提供了一个cpu-topo的程序。

参考:http://software.intel.com/en-us/articles/intel-64-architecture-processor-topology-enumeration/   

 

----------------------------------------------Fri May 25 2012-------------------------------------------- -

 

Linux:

1. 在Ubuntu11.10上安装Chrome出错,说deb文件无法打开,经查阅解决方案如下:

 

sudo apt-get install -f

sudo dpkg -i google-chrome-stable_current_i386.deb

 

2. 找到一个terminal的替代品,guake,表示很酷很好用

3. conky一个系统监视软件,很酷,不过现在用不到,先留着

4. Macbuntu ubuntu上的mac主题包,对11.10的支持有限,文档上写的不支持,不过也可以安装,把UBUVER改成你的ubuntu版本就就可以,安装后可能会有bug。我的ubuntu为11.10,安装后不会覆盖ubuntu自带的unity(就是左侧的那个任务栏,表示很丑,可能用windows用习惯了,全局菜单也不习惯,这样有些程序全屏都全屏不了,比如chrome),且docky不会自动运行,需要自己配置,很酷,但是用起来不习惯

 

----------------------------------------------Mon May 28 2012--------------------------------------------

MPI:

1. MPICH2不支持Infiniband。最初没调查清楚,以为MPICH2支持并会自动选择Infiniband,看来需要重新进行测试了:

支持Infiniband的库:MVAPICH2,OopenMPI

2. 使用非MVAPICH2的mpicc编译程序时,除了libmpich外还需要额外引入-lrdmacm -libverbs -libumad -ldl,不过最好还是使用MVAPICH2带的mpicc。

----------------------------------------------Tue May 29 2012--------------------------------------------

Infiniband:

1. Infiniband 的编程接口标准:OFED,由OFA开发

MVAPICH2:

1. MV2对编译的程序会自动进行CPU affinity,此时使用taskset和numactl是不管用的,如果不想使用该功能或者需要自己指定,export MV2_ENABLE_AFFINITY=0,或者使用MV2提供的自定义CPU affinity的方式:使用PLPA,MV2_CPU_MAPPING环境变量

----------------------------------------------Thu May 31 2012-------------------------------------------

Linux:

1. ifconfig得到的输出,rx和tx的含义

   RX is the telegraph and radio abbreviation for "receive" or "receiver".

   TX, the telegraph abbreviation for transmission

2. netstat 命令用法,常见参数:

 

-a (all)显示所有选项,默认不显示LISTEN相关
-t (tcp)仅显示tcp相关选项
-u (udp)仅显示udp相关选项
-n 拒绝显示别名,能显示数字的全部转化成数字。
-l 仅列出有在 Listen (监听) 的服務状态

-p 显示建立相关链接的程序名
-r 显示路由信息,路由表
-e 显示扩展信息,例如uid等
-s 按各个协议进行统计
-c 每隔一个固定时间,执行该netstat命令。

-i  显示interface的信息

参考:http://blog.chinaunix.net/uid-25940216-id-3213921.html 

3. watch 是一个非常实用的命令,基本所有的 Linux 发行版都带有这个小工具,如同名字一样,watch 可以帮你监测一个命令的运行结果,省得你一遍遍的手动运行。如:watch ifconfig  watch free -m用于监控网络及内存使用  默认 watch 会以 2s 的间隔重复运行命令,你也可以用 -n 参数指定时间间隔,还有一个实用的参数是 -d,这样 watch 会帮你高亮显示变化的区域,这样更加一目了然了~

OpenMPI,MVAPICH2, Infiniband:

1. 使用MVAPICH2编译的程序默认使用infiniband,但是在ifconfig中看不到流量变化,原因未知

2. openmpi可以在运行时指定运行时的通信网络,使用-mca btl 指定,如openib, sm , tcp,可用的btl可用ompi_info查看

3. openMPI绑定进程的机制还是不错的,不再需要使用taskset来设置了

----------------------------------------------Fri Jun 1 2012-------------------------------------------

Linux:

1. ifconfig RX/TX do not reflect the infiniband native verbs communication. These counters will change only if you run TCP/IP over infiniband network.

2. collectl utility : show traffic over infiniband, 对infiniband的支持使用perfquery实现,需要root权限

3. 设置程序的SUID位,chmod +/-s  <program>

4. ls -l 第二列显示的link数

OpenMPI,MVAPICH2, Infiniband:

1. OpenMPI 的tcp运行方式使用的IPoIB(IB可用的情况下),ifconfig显示eth0/ib0 都有流量。

----------------------------------------------Sat Jun 2 2012------------------------------------------- 

Windows:

1. 命令行设置IP方法:netsh interface ip set address name="本地连接" source=static addr=  mask= gateway= 

posted @ 2012-06-05 09:12  D3猎人  阅读(735)  评论(0编辑  收藏  举报