2012年8月

116 #ifdef FORK
117  pid = FORK ();
118 #else
119  pid = __fork ();
120 #endif
121  if(pid == (pid_t) 0)
122    {
123      /** Child side.  */
124      constchar*new_argv[4];
125      new_argv[0] = SHELL_NAME;
126      new_argv[1] = "-c";
127      new_argv[2] = line;
128      new_argv[3] = NULL;
129
130      /** Restore the signals.  */
131      (void) __sigaction (SIGINT, &intr, (structsigaction *) NULL);
132      (void) __sigaction (SIGQUIT, &quit, (structsigaction *) NULL);
133      (void) __sigprocmask (SIG_SETMASK, &omask, (sigset_t *) NULL);
134      INIT_LOCK ();
135
136      /** Exec the shell.  */
137      (void) __execve (SHELL_PATH, (char*const*) new_argv, __environ);  //exec被代替改程序,如果失败的话,就是执行下一条
138      _exit (127);  //直接进入内核中断,返回127.
139    }
140  elseif(pid < (pid_t) 0)
141    /** The fork failed.  */
142    status = -1;
143  else
144    /** Parent side.  */
145    {
146      /** Note the system() is a cancellation point.  But since we call
147     waitpid() which itself is a cancellation point we do not
148     have to do anything here.  */
149      if(TEMP_FAILURE_RETRY (__waitpid (pid, &status, 0)) != pid)
150    status = -1;
151    }

waitpid(等待子进程中断或结束) 

 
相关函数  wait,fork
  
表头文件  #include<sys/types.h>
#include<sys/wait.h>
  
定义函数  pid_t waitpid(pid_t pid,int* status,int options);
  
函数说明  waitpid()
会暂时停止目前进程的执行,直到有信号来到或子进程结束。如果在调用wait()
时子进程已经结束,则wait()
会立即返回子进程结束状态值。子进程的结束状态值会由参数status
返回,而子进程的进程识别码也会一快返回。如果不在意结束状态值,则参数status
可以设成NULL。参数pid为欲等待的子进程识别码,其他数值意义如下:
pid<-1 等待进程组识别码为pid绝对值的任何子进程。
pid=-1 等待任何子进程,相当于wait()。
pid=0 等待进程组识别码与目前进程相同的任何子进程。
pid>0 等待任何子进程识别码为pid的子进程。
参数option可以为0 或下面的OR 组合
WNOHANG 如果没有任何已经结束的子进程则马上返回,不予以等待。
WUNTRACED 如果子进程进入暂停执行情况则马上返回,但结束状态不予以理会。
子进程的结束状态返回后存于status,底下有几个宏可判别结束情况
WIFEXITED(status)如果子进程正常结束则为非0值。
WEXITSTATUS(status)取得子进程exit()返回的结束代码,一般会先用WIFEXITED  
来判断是否正常结束才能使用此宏。
WIFSIGNALED(status)如果子进程是因为信号而结束则此宏值为真
WTERMSIG(status)取得子进程因信号而中止的信号代码,一般会先用WIFSIGNALED  
来判断后才使用此宏。
WIFSTOPPED(status)如果子进程处于暂停执行情况则此宏值为真。一般只有使用
WUNTRACED 时才会有此情况。
WSTOPSIG(status)取得引发子进程暂停的信号代码,一般会先用WIFSTOPPED  
来判断后才使用此宏。
  
返回值  如果执行成功则返回子进程识别码(PID),如果有错误发生则返回-1
。失败原因存于errno中。


MySQL性能监控小知识

一,获取mysql用户下的进程总数

ps -ef | awk '{print $1}' | grep "mysql" | grep -v "grep" | wc-1

二,主机性能状态

# uptime
[root@ ~]# uptime
13:05:52 up 53 days, 52 min,  1 user,  load average: 0.00, 0.00, 0.00

三,CPU使用率

# top

# vmstat

四,磁盘IO量

# vmstat 或 # iostat
五,swap进出量[内存]

# free
六,数据库性能状态
(1)QPS(每秒Query量)
QPS = Questions(or Queries) / seconds
mysql > show /*50000 global */ status like 'Question';

(2)TPS(每秒事务量)
TPS = (Com_commit + Com_rollback) / seconds
mysql > show status like 'Com_commit';
mysql > show status like 'Com_rollback';

(3)key Buffer 命中率
key_buffer_read_hits = (1-key_reads / key_read_requests) * 100%
key_buffer_write_hits = (1-key_writes / key_write_requests) * 100%

mysql> show status like 'Key%';

(4)InnoDB Buffer命中率
innodb_buffer_read_hits = (1 - innodb_buffer_pool_reads / innodb_buffer_pool_read_requests) * 100%

mysql> show status like 'innodb_buffer_pool_read%';

(5)Query Cache命中率
Query_cache_hits = (Qcahce_hits / (Qcache_hits + Qcache_inserts )) * 100%;

mysql> show status like 'Qcache%';
(6)Table Cache状态量
mysql> show status like 'open%';

(7)Thread Cache 命中率
Thread_cache_hits = (1 - Threads_created / connections ) * 100%

mysql> show status like 'Thread%';

mysql> show status like 'Connections';

(锁定状态
mysql> show status like '%lock%';

(9)复制延时量
mysql > show slave status

(10) Tmp Table 状况(临时表状况)
mysql > show status like 'Create_tmp%';
(11) Binlog Cache 使用状况
mysql > show status like 'Binlog_cache%';

(12) Innodb_log_waits 量
mysql > show status like 'innodb_log_waits';

开源监控软件
一,RRDTool
二,Nagios
三,MRTG
四,Cacti