1. 查看linux内核版本
方法一:
命令: uname -a // uname is short for unix name
作用: 查看系统内核版本号及系统名称
方法二:
命令: cat /proc/version
作用: 查看目录”/proc”下version的信息,也可以得到当前系统的内核版本号及系统名称
补充说明:/proc文件系统,它不是普通的文件系统,而是系统内核的映像。The proc file system is a pseudo-file system which is used as an interface to kernel data structures. It is commonly mounted at /proc. Most of it is read-only, but some files allow kernel variables to be changed. 我们使用命令“uname -a”的信息就是从该文件获取的。
2. 查看进程打开的所有文件描述符
方法一:ll /proc/<进程PID>/fd/
方法二:lsof -p <进程PID>
3. 设置和查看系统资源限制ulimit
ulimit(short for user limits): it provides control over the resources available to the shell and to processes started by it.Syntax
ulimit [-acdfHlmnpsStuv] [limit]
Options
-S Change and report the soft limit associated with a resource.
-H Change and report the hard limit associated with a resource.
-a All current limits are reported.
-c The maximum size of core files created.
-d The maximum size of a process's data segment.
-f The maximum size of files created by the shell(default option)
-l The maximum size that can be locked into memory.
-m The maximum resident set size.
-n The maximum number of open file descriptors.
-p The pipe buffer size.
-s The maximum stack size.
-t The maximum amount of cpu time in seconds.
-u The maximum number of processes available to a single user.
-v The maximum amount of virtual memory available to the process.
ulimit 作为对资源使用限制的一种工作,是有其作用范围的。那么,它限制的对象是单个用户,单个进程,还是整个系统呢?事实上,ulimit 限制的是当前shell进程以及其派生的子进程。举例来说,如果用户同时运行了两个shell终端进程,只在其中一个环境中执行了ulimit –f 100,则该shell进程里创建文件的大小受到相应的限制,而同时另一个shell终端包括其上运行的子程序都不会受其影响。
那么,是否有针对某个具体用户的资源加以限制的方法呢?答案是有的,方法是通过修改系统的 /etc/security/limits 配置文件。该文件不仅能限制指定用户的资源使用,还能限制指定组的资源使用。该文件的每一行都是对限定的一个描述,格式如下:<domain> <type> <item> <value>
domain 表示用户或者组的名字,还可以使用 * 作为通配符。type 可以有两个值,soft 和 hard。item 则表示需要限定的资源,可以有很多候选值,如 stack,cpu,nofile 等等,分别表示最大的堆栈大小,占用的 cpu 时间,以及打开的文件数。通过添加对应的一行描述,则可以产生相应的限制。例如:* hard nofile 100
该行配置语句限定了任意用户所能创建的最大文件数是100。
现在已经可以对进程和用户分别做资源限制了,看似已经足够了,其实不然。很多应用需要对整个系统的资源使用做一个总的限制,这时候我们需要修改 /proc 下的配置文件。/proc 目录下包含了很多系统当前状态的参数,例如 /proc/sys/kernel/pid_max,/proc/sys/net/ipv4/ip_local_port_range 等等,从文件的名字大致可以猜出所限制的资源种类。由于该目录下涉及的文件众多,在此不一一介绍。
4. error while loading shared libraries
库文件在链接(静态库和共享库)和运行(仅限于使用共享库的程序,因为静态库已经链接到可执行程序中了)时被使用,其搜索路径是在系统中进行设置的。一般linux系统把 /lib 和 /usr/lib 两个目录作为默认的库搜索路径,所以使用这两个目录中的库时不需要进行设置搜索路径即可直接使用。对于处于默认库搜索路径之外的库,需要将库的位置添加到 库的搜索路径之中。设置库文件的搜索路径有下列两种方式,可任选其一使用:
(1) 修改环境变量LD_LIBRARY_PATH
在环境变量 LD_LIBRARY_PATH 中指明库的搜索路径。例如$export LD_LIBRARY_PATH=/opt/gtk/lib:$LD_LIBRARY_PATH。并且LD_LIBRARY_PATH路径优先于系统默认路径之前查找
(2) 修改配置文件ld.so.conf
添加方法也极其简单,将库文件的绝对路径直接写进去就OK了,一行一个。例如:
/usr/X11R6/lib
/usr/local/lib
需要注意的是:第二种搜索路径的设置方式对于程序链接时的库(包括共享库和静态库)的定位已经足够了,但是对于使用了共享库的程序的执行还是不够的。这是因为为了加快程序执行时对共享库的定位速度,避免使用搜索路径查找共享库的低效率,所以是直接读取库列表文件 /etc/ld.so.cache 从中进行搜索的。/etc/ld.so.cache 是一个非文本的数据文件,不能直接编辑,它是根据 /etc/ld.so.conf 中设置的搜索路径由 /sbin/ldconfig 命令将这些搜索路径下的共享库文件集中在一起而生成的(ldconfig 命令要以 root 权限执行)。
因此,为了保证程序执行时对库的定位,在 /etc/ld.so.conf 中进行了库搜索路径的设置之后,还必须要运行 /sbin/ldconfig 命令更新 /etc/ld.so.cache 文件之后才可以。ldconfig ,简单的说,它的作用就是将/etc/ld.so.conf列出的路径下的库文件缓存到/etc/ld.so.cache 以供使用。因此当安装完一些库文件,(例如刚安装好glib),或者修改ld.so.conf增加新的库路径后,需要运行一下 /sbin/ldconfig使所有的库文件都被缓存到ld.so.cache中,如果没做,即使库文件明明就在/usr/lib下的,也是不会被使用的,结果编译过程中报错,缺少xxx库,去查看发现明明就在那放着。
在程序链接时,对于库文件(静态库和共享库)的搜索路径,除了上面的设置方式之外,还可以通过 -L 参数显式指定。因为用 -L 设置的路径将被优先搜索,所以在链接的时候通常都会以这种方式直接指定要链接的库的路径。
现代链接器在处理动态库时将 链接时路径(Link-time path)和运行时路径(Run-time path)分开,用户可以通过-L指定链接时库的路径,通过-R(或-rpath)指定程序运行时库的路径,大大提高了库应用的灵活性和搜索库文件的效率。
5. 墙上时钟时间,用户cpu时间,系统cpu时间
时钟时间(墙上时钟时间wall clock time):从进程从开始运行到结束,时钟走过的时间,这其中包含了进程在阻塞和等待状态的时间。
用户CPU时间:用户进程获得了CPU资源以后,在用户态执行的时间。
系统CPU时间:用户进程获得了CPU资源以后,在内核态的执行时间。
进程的三种状态为阻塞、就绪、运行。
时钟时间 = 阻塞时间 + 就绪时间 + 运行时间
用户CPU时间 = 运行状态下用户空间的时间
系统CPU时间 = 运行状态下内核空间的时间
用户CPU时间 + 系统CPU时间 = 运行时间。