代码改变世界

随笔分类 - Linux/Unix

Linux系统性能统计工具Sar和实时系统性能监控脚本

2015-02-05 15:29 by zhenjing, 3531 阅读, 收藏, 编辑
摘要:sar(System Activity Reporter系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况、系统调用的使用情况、磁盘I/O、CPU效率、内存使用状况、进程活动及IPC有关的活动等。 阅读全文

shell脚本常规技巧

2014-03-11 20:24 by zhenjing, 7735 阅读, 收藏, 编辑
摘要:常用shell脚本片段收集。 阅读全文

vsftpd常规操作指南

2012-08-28 12:47 by zhenjing, 2922 阅读, 收藏, 编辑
摘要:介绍vsftpd的配置、用户、常见操作等。 阅读全文

过载保护

2012-06-26 13:04 by zhenjing, 3681 阅读, 收藏, 编辑
摘要:什么情况会导致系统过载?系统处理能力 请求量 = 系统过载。设计系统时都需要系统的处理能力,比如每秒的处理能力、请求峰值、平均处理时延等。这3个指标可很好地估计系统最大处理能力、需要多少机器提供服务、是否需要扩容等。但评估容易只关注 请求量峰值,而忽略系统处理能力的变化。从公式上看,系统处理能力降低同样会造成过载。 阅读全文

linux的IO调度算法和回写机制

2012-06-20 11:29 by zhenjing, 11825 阅读, 收藏, 编辑
摘要:Linux IO调度程序是块设备I/O子系统的主要组件。块设备I/O子系统最核心的任务也就是提高块设备的整体性能,为此Linux实现了四种IO调度算法,算法的基本思想就是通过合并和排序IO请求队列中的请求大大降低所需的磁盘寻道时间,从而提供整体IO性能。 不管如何优化块设备调度算法,也不可能解决磁盘IO和CPU速度严重不匹配的问题,为此Linux引入了页高速缓存。页高速缓存最开始是为内存管理而设计的,在2.6内核中,各种基于页的数据管理都纳入页高速缓存。因此块设备的IO缓冲区也属于页高速缓存。这些和使用者无关,是内核开发者需要关心的。对于开发者,需要知道的是:所有文件的IO操作都是“读写缓存”。对于读操作,只有当数据不在缓存时才需要IO操作。对于写操作,一定需要IO操作,但内核把数据写到高速缓存后write系统调用立马返回,内核采用特定的写进程统一回写dirty的缓存页。即内核对读写是分别对待的:“同步读,异步写”! 阅读全文

linux性能监控

2012-06-17 15:30 by zhenjing, 3705 阅读, 收藏, 编辑
摘要:linux的性能监控对于分析各种系统问题至关重要。一般情况下,直接启动命令看输出。但有时需要监控某个特定时间系统的运行状况,简单办法就是定时启动命令,并将命令输入打印到log, 或者使用诸如sar这类强大的性能监视工具。 贴几个监控工具的包装脚本,结合crontab即可实现定时启动、收集一定时间间隔的性能数据。 阅读全文

进程互斥与竞态

2011-07-15 09:33 by zhenjing, 3680 阅读, 收藏, 编辑
摘要:后台程序经常要求有且只有一个实例存在,以防止资源访问冲突。如何实现单一实例进程限制呢?本文讨论了2种常用实现机制。同时讨论了和文件锁机制相关的话题:系统调用和竞态。竞态是系统编程中很常见的一个问题。凡涉及多于2个的系统调用组合均可能存在竞态。竞态的本质也是资源的访问冲突。 阅读全文

RAII、栈展开和程序终止

2011-07-06 00:11 by zhenjing, 2978 阅读, 收藏, 编辑
摘要:RAII(资源获取即初始化RAII, Resource Acquisition Is Initialization)是C++编程中很重要的一项技术。其原理是在对象析构函数中释放该对象获取的资源,利用栈展开过程栈上对象的析构函数将被自动调用的保证,从而正确地释放先前获取的资源。RAII只有在栈展开正常执行的前提下才能正常工作。函数调用和正常的C++异常处理流程(异常处于try-catch块)都存在栈展开。应该特别注意的是:在程序运行过程中,RAII可以可靠地正确地释放资源;但当程序非正常终止时,栈展开经常被忽略,从而导致RAII失效。 阅读全文

文件锁与NFS文件锁

2011-07-04 21:46 by zhenjing, 9886 阅读, 收藏, 编辑
摘要:文件是Linux系统中的重要概念。CPU,内存,磁盘,网卡,各种输入输出设备是操作系统管理的各种资源。其中除了CPU、内存用于计算之外,其余的资源均可看成输入输出设备。磁盘作为最核心的数据持久化设备,其上的数据一般以文件形式加以管理。Linux的文件基于一个很重要的抽象概念: 虚拟文件系统。虚拟文件系统提供一组统一的文件操作接口,从而屏蔽底层硬件设备的差别。只要硬件的驱动支持虚拟文件系统的接口,那么操作系统就可以按照统一的文件操作接口来读写该硬件设备的数据(输入/输出)。 文件本身也是一种很重要的进程间通讯方式,进程以文件的方式来共享各种数据。文件锁则是一种重要的进程间同步机制。因文件锁独特的进程生存期机制,从而大大简化文件锁的管理(尤其是错误处理)。 本文从内核中的文件数据结构谈起,讲解如何使用flock/fcntl,NFS文件锁,以及一些替代的文件锁机制。 阅读全文

Gdb调试多进程程序

2011-06-01 13:45 by zhenjing, 23385 阅读, 收藏, 编辑
摘要:介绍使用gdb调试多进程程序的几种常见办法:方法1:调式多进程最土的办法:attach pid; 方法2: set follow-fork-mode child + main断点; 方法3: set follow-fork-mode child + catch exec; 方法4:info inferiors/inferior inferiors 阅读全文

NFS4.1规范研究:session

2011-05-29 23:12 by zhenjing, 3940 阅读, 收藏, 编辑
摘要:NFS4.1中session机制的概述。session核心是管理连接(connection)。NFS4中客户端和服务器只有一个连接,限制了并发访问。NFS4.1允许多服务器同时提供服务,故客户端和服务器的连接数可大于1。除了支持并发访问外,session也更好地支持回调和EOS。 阅读全文

诡异的bug: tcsh陷入死循环

2011-05-26 12:05 by zhenjing, 2837 阅读, 收藏, 编辑
摘要:问题:项目开发中,碰到一个很奇怪的问题:当tcsh启动的子程序退出之后,tcsh本身无法退出,并占用大量CPU资源。 给出对这个问题的分析和重现程序。 阅读全文

NFS4文件锁机制探秘

2011-05-15 11:21 by zhenjing, 6069 阅读, 收藏, 编辑
摘要:NFS3之前的NFS系统均为无状态的。无状态的server/client大大简化NFS的设计,尤其是故障恢复基本无需考虑。但也因此,NFS3本身无法支持文件锁,Network Lock Manager (NLM)作为NFS3的辅助协议用于管理NFS的文件锁。 NFS4在自身的协议中引入文件锁,这使NFS具有状态。本文对NFS4如何实现文件锁做一些基本的探讨,主要是想通过研究NFS4的锁机制,学习如何设计有状态的可靠的server/client系统。 阅读全文

Usage of pmake

2011-04-20 09:31 by zhenjing, 840 阅读, 收藏, 编辑
摘要:IntroductionPmake is a program designed to simplify themaintenance of other programs. Its input is a list of specifications as to thefiles upon which programs and other files depend. mkdep, a program to constructMakefile dependency lists, is also included.This doc is not to introduce how to usepmake 阅读全文

3个学习Socket编程的简单例子:TCP Server/Client, Select

2011-04-20 09:29 by zhenjing, 4243 阅读, 收藏, 编辑
摘要:以前都是采用ACE的编写网络应用,最近由于工作需要,需要直接只用socket接口编写CS的代码,重新学习这方面的知识,给出自己所用到的3个简单例子,都是拷贝别人的程序。如果你能完全理解这3个例子,估计socket编程就已经基本入门了。 建议:1) 多多查查所用到的网络接口; 2) 最好有一本书,如UNIX环境高级编程,UNIX网络编程,可查询;3) 可以直接使用书上的例子更好。 TCP Client代码:#include <sys/stat.h> #include <sys/types.h> #include <sys/socket.h> #include 阅读全文

socket基础知识

2011-04-20 09:28 by zhenjing, 1997 阅读, 收藏, 编辑
摘要:socket基础知识 概述 socket 是TCP/IP协议的最流行的一种网络编程接口。它与TCP/IP一起最早实现于4.1BSD UNIX 系统中,主要用于传送级(TCP,UDP)编程。 socket往往称为套接口,套接口用于网络中两个通信实体间的通信,两个实体可以存在于同一机器的不同进程中或不同机器的进程中。 套接口就好像UNIX中pipe (管道),通信双方进程通过它来与对方发送或接受数据。如同pipe 用文件描述字表示一样,socket 也用文件描述字表示,也称为套接口描述字,或简称套接字。在网络编程时要用套接字表示通信的对方。但两者不同的是,pipe的通信双方在一台机器上,共用一个p 阅读全文

使用Select的3个注意事项

2011-04-20 09:26 by zhenjing, 458 阅读, 收藏, 编辑
摘要:#include <sys/select.h> int select(int n, fd_set *readfds, fd_set*writefds, fd_set *exceptfds, struct timeval *timeout);int pselect(int n, fd_set *readfds, fd_set*writefds, fd_set *exceptfds, const struct timespec *timeout, const sigset_t*sigmask);FD_CLR(int fd, fd_set *set);FD_ISSET(int fd, f 阅读全文

GCC/G++常见链接错误

2011-04-20 09:21 by zhenjing, 933 阅读, 收藏, 编辑
摘要:链接错误的直接表现就是:****符号未定义。几种常见的链接错误如下:缺少*.o文件 ---- 对策:将相应的文件加入Makefile或命令行*.o文件未更新 ---- 对策:删除旧*.o文件重新编译或者依赖于最新的depend来编译(增删文件时确保make depend)。缺少相应的库文件 ---- 对策:将相应的文件加入Makefile或命令行依赖的库文件版本不对或未更新 ---- 对策:重新生成所依赖的库文件库文件的出现顺序不对 ----- 对策:根据库的依赖关系,调整库出现的顺序。原则:只允许先出现的库依赖于后出现的库。其中,第5种错误最难发现。如果发现程序所需的库都已经引入,但仍出现链 阅读全文

[Advance] How to debug a program (下):示例

2011-03-23 13:10 by zhenjing, 1149 阅读, 收藏, 编辑
摘要:原理:程序=指令+数据。 指令:用户代码(Text)+静态库+动态库。反汇编可得程序指令。 数据:Data -- 已初始化的全局数据,包括常量字符串;BSS -- 未初始化的全局数据;Heap; Stack;Register 阅读全文

[Advance] How to debug a program (上)

2011-03-22 12:16 by zhenjing, 2066 阅读, 收藏, 编辑
摘要:介绍64位linux系统下的一种高级调试技巧。32位类似,内存分布略有区别。 阅读全文