代码改变世界

随笔分类 - Linux/Unix

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

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

shell脚本常规技巧

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

vsftpd常规操作指南

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

过载保护

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

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

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

进程互斥与竞态

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

RAII、栈展开和程序终止

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

文件锁与NFS文件锁

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

Gdb调试多进程程序

2011-06-01 13:45 by zhenjing, 22040 阅读, 收藏, 编辑
摘要:介绍使用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, 3292 阅读, 收藏, 编辑
摘要:NFS4.1中session机制的概述。session核心是管理连接(connection)。NFS4中客户端和服务器只有一个连接,限制了并发访问。NFS4.1允许多服务器同时提供服务,故客户端和服务器的连接数可大于1。除了支持并发访问外,session也更好地支持回调和EOS。 阅读全文

诡异的bug: tcsh陷入死循环

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

NFS4文件锁机制探秘

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

socket基础知识

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

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

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

[Advance] How to debug a program (上)

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

[转] Real-World Concurrency

2011-03-15 13:37 by zhenjing, 404 阅读, 收藏, 编辑
摘要:1. Know your cold paths from your hot paths. 弄清楚代码里的热门执行路径和冷门执行路径。 2. Intuition is frequently wrong—be data intensive. 直觉常常是错的,要靠数据说话。 3. Know when—and when not—to break up a lock. 知道什么时候把一个锁拆成多个,并知道什么时候不必这样做。 4. Be wary of readers/writer locks. 警惕读写锁。 5. Consider per-CPU locking. 考虑用每个 CPU 用一个锁。 6. Know when to broadcast—and when to signal. 知道什么时候用单个唤醒,什么时候用广播唤醒。 7. Learn to debug postmortem. 学会验尸 8. Design your systems to be composable. 设计系统(s),使之能相互组合。 9. Don’t use a semaphore where a 阅读全文

[转] Buffer Overflows and You (下)

2011-03-03 11:59 by zhenjing, 563 阅读, 收藏, 编辑
摘要:Got root?Gentlemen, we can root it. We have the technology. We have the capability to root yet another poor idiot&#39;s server on the int4rw3bs. Steve Austin will be that man. Better than he was before. Better, stronger, faster, errrr...We spent all that time developing a small bit of shellcode. Let 阅读全文

[转] Buffer Overflows and You (上)

2011-03-03 11:48 by zhenjing, 608 阅读, 收藏, 编辑
摘要:Magical gnomes present: Buffer Overflows and You Is it the 90's? Are you wondering why your server is running slow? Why it's trying to ping flood some host in California? Why someone else is logged into your machine and you've recently become a prominent porn hosting provider? This site will help you figure it all out. And if you have a time machine, you can probably go back and do it to someone else! Before continuing, it's important to note that this guide is designed for 64-bit systems. 阅读全文

How to create a size-limited file-system

2011-01-18 15:57 by zhenjing, 273 阅读, 收藏, 编辑
摘要:在特定情况下(如测试),需要建立大小受限的文件夹,最简单的办法莫过于使用linux提供的Loopback设备。Loopback文件系统就是把一个文件和另外的一个文件系统联系起来,就像一个完整文件系统一样。它可以被格式化和mount成以上所提到过的文件系统。这样,这些设备就被称为/dev/loop0或者/dev/loop1,然后和文件产生联系,然后这个虚拟设备被mount。 阅读全文

Condition Variables(条件变量)用法指南

2010-12-30 12:01 by zhenjing, 2535 阅读, 收藏, 编辑
摘要:详细介绍Linux/Unix下condition variable(条件变量)的用法:pthread_cond_timedwait,pthread_cond_wait, pthread_cond_broadcast, pthread_cond_signal。 同时介绍了Condition variable and thread cancellation, Condition variable and signal, Condition variable and signal handler. 阅读全文

pthread_atfork用法

2010-12-28 12:05 by zhenjing, 3108 阅读, 收藏, 编辑
摘要:pthread_atfork的manual。虽然pthread_atfork无法解决多线程下fork的所有问题,但仍然是减少fork死锁的工具,尤其适用于库的编写,即:多线程库应该有意地提供接口以获取所有的锁以及释放它们(锁最好有粒度区别) 阅读全文

Thread Cancel 指南

2010-12-27 11:59 by zhenjing, 1561 阅读, 收藏, 编辑
摘要:详细介绍与线程取消(cancel)相关的编程接口:pthread_cancel,pthread_setcancelstate,pthread_setcanceltype, pthread_cleanup_pop,pthread_cleanup_push,pthread_join,pthread_detach 阅读全文

UNIX上C++程序设计守则(信号和线程)(下)

2010-12-23 12:01 by zhenjing, 7792 阅读, 收藏, 编辑
摘要:准则4: 请不要做线程的异步撤消的设计; 准则5: 尽可能避免线程中做延迟撤销的处理; 准则6: 遵守多线程编程的常识 阅读全文

UNIX上C++程序设计守则(信号和线程)(上)

2010-12-22 12:00 by zhenjing, 2794 阅读, 收藏, 编辑
摘要:Unix/Linux编写程序离不开信号、多进程/多线程,尤其是编写服务器程序。然而正确编写多进程/多线程程序是很难的事情。难不在于写出可工作的程序,而在于写出持续工作的程序。这篇文章是转载,关于这个话题,这是本人见过的最好的文章。推荐之。准则1:不依赖于信号收发的设计;准则2: 要知道信号处理函数中可以做那些处理;准则3:多线程程序里不准使用fork 阅读全文

Usage of Protocol Buffer

2010-11-15 23:01 by zhenjing, 2607 阅读, 收藏, 编辑
摘要:Protocol Buffer简单学习教程。去年用过Protocol Buffer后,写下的总结,应该有助于快速上手。 阅读全文

Linux Debug tools

2010-10-27 11:47 by zhenjing, 3029 阅读, 收藏, 编辑
摘要:虽然搞了Unix/Linux的分类,却一直没有发表相关的随笔。这算第一篇吧。经验有限,欢迎补充! 阅读全文