linux — 1 comment
24
十一 11
当需要查看linux负载信息时,需要用到vmstat,已查看系统cpu、内存、io等负载情况。
vmstat命令详细输出如下:
1.vmstat结果内容的解释
Vmstat
procs ———–memory———- —swap– —–io—- –system– —–cpu——
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 88 199564 134860 1175252 0 0 0 352 9323 10496 8 6 85 0 0
procs
r 列表示运行和等待cpu时间片的进程数,如果长期大于1,说明cpu不足,需要增加cpu。
b 列表示在等待资源的进程数,比如正在等待I/O、或者内存交换等。
memory
swpd 切换到内存交换区的内存数量(k表示)。如果swpd的值不为0,或者比较大,比如超过了100m,只要si、so的值长期为0,系统性能还是正常
free 当前的空闲页面列表中内存数量(k表示)
buff 作为buffer cache的内存数量,一般对块设备的读写才需要缓冲。
cache: 作为page cache的内存数量,一般作为文件系统的cache,如果cache较大,说明用到cache的文件较多,如果此时IO中bi比较小,说明文件系统效率比较好。
swap
si 由内存进入内存交换区数量。
so由内存交换区进入内存数量。
IO
bi 从块设备读入数据的总量(读磁盘)(每秒kb)。
bo 块设备写入数据的总量(写磁盘)(每秒kb)
这里我们设置的bi+bo参考值为1000,如果超过1000,而且wa值较大应该考虑均衡磁盘负载,可以结合iostat输出来分析。
system 显示采集间隔内发生的中断数
in 列表示在某一时间间隔中观测到的每秒设备中断数。
cs列表示每秒产生的上下文切换次数,如当 cs 比磁盘 I/O 和网络信息包速率高得多,都应进行进一步调查。
cpu 表示cpu的使用状态
us 列显示了用户方式下所花费 CPU 时间的百分比。us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,需要考虑优化用户的程序。
sy 列显示了内核进程所花费的cpu时间的百分比。这里us + sy的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足。
wa 列显示了IO等待所占用的CPU时间的百分比。这里wa的参考值为30%,如果wa超过30%,说明IO等待严重,这可能是磁盘大量随机访问造成的,也可能磁盘或者磁盘访问控制器的带宽瓶颈造成的(主要是块操作)。
id 列显示了cpu处在空闲状态的时间百分比 Continue reading →
linux — No comments
13
十一 11
转载请注明连接: http://developerblog.org/?p=250
FastCgi不仅可以用于webserver与PHP的交互,也可用于任何两个应用之间的交互,PHPer用的比较多的应该就是用于两个子系统之间的交互。
比如A系统和B系统分部独立的部署在两台机器上,其之间通信用的比较多的http协议通信,但通过fastcgi协议通信可以更加简洁、高效。 Continue reading →
php — No comments
13
十一 11
关于fastcgi的具体介绍,这里就不多说了,关于fastcgi的介绍见:http://baike.baidu.com/view/641394.htm,关于fastcgi规范的介绍见:http://developerblog.org/?p=235。
PHP动态网页的实现主要有两种方式,一种是apache的mod_php形式,它把php当做apache的一个内置模块,让其本身就支持php语言;另一种是fastcgi的形式,webserver与php之间通过fastcig协议交互,如nginx、lighttpd多为这种。 Continue reading →
C/C++ — No comments
07
十一 11
FastCGI是对CGI的开放的扩展,它为所有因特网应用提供高性能,且没有Web服务器API的缺点(penalty)。
本规范具有有限的(narrow)目标:从应用的视角规定FastCGI应用和支持FastCGI的Web服务器之间的接口。Web服务器的很多特性涉及FastCGI,举例来说,应用管理设施与应用到Web服务器的接口无关,因此不在这儿描述。 Continue reading →
linux — 1 comment
25
九 11
因为电脑是windows 7系统,开发环境又在linux,经常在linux碰到乱码问题,很是痛苦,于是决定好好了解编码的来龙气脉,并分享个各位,免得出现乱码时不知所措。
是否存在文件编码
在讲解字符编码之前,我们需先明确文件本身没有编码一说,只有文字才有编码的概念,我们通常说某个文件是什么编码,通常是指文件里字符的编码。
为什么会出现乱码
我在linux下一般使用vim进行文件编辑,发现经常会碰到乱码的情况,那么为什么会出现乱码呢?
首先我们了解下vim编码方面的基础知识,关于编码方面vim存在3个变量:
1.encoding: Vim 内部使用的字符编码方式,包括 Vim 的 buffer (缓冲区)、菜单文本、消息文本等。默认是根据你的locale选择.用户手册上建议只在 .vimrc 中改变它的值,事实上似乎也只有在.vimrc 中改变它的值才有意义。你可以用另外一种编码来编辑和保存文件,如你的vim的encoding为utf-8,所编辑的文件采用cp936编码,vim会自动将读入的文件转成utf-8(vim的能读懂的方式),而当你写入文件时,又会自动转回成cp936(文件的保存编码).
2.fileencoding: Vim 中当前编辑的文件的字符编码方式,Vim 保存文件时也会将文件保存为这种字符编码方式 (不管是否新文件都如此)。
3.termencoding: Vim 所工作的终端 (或者 Windows 的 Console 窗口) 的字符编码方式。如果vim所在的term与vim编码相同,则无需设置。如其不然,你可以用vim的termencoding选项将自动转换成term的编码.
当这三个变量的编码出现问题时就会出现乱码。
1.encoding不是utf-8编码。
如果encoding不是utf-8编码,其他字符可能无法转为
Encoding的指定编码。如:如果encoding是gbk编码,而文件内容采用big5编码的,其就无法转换为gbk编码。
2.fileencoding不对。
Fileencoding编码是vim的读取文件内容时使用的编码,如果其编码与文件字符编码不同,必然会出现乱码。Fileencoding编码一般由vim自动检测,可以使用fileencodings设置 Vim自动探测fileencoding的顺序列表。不过vim有时候会检测错误,就会出现乱码了。
3.termencoding编码不对。
我们登录服务器一般采用远程登录,这就涉及终端编码问题,我经常碰到因为终端编码不对导致乱码的。如:SecureCRT设置为utf-8编码,而vim的termencoding却为gbk,就出现乱码了。
Continue reading →
算法 — No comments
08
九 11
一、 Bloom-Filter算法简介。
Bloom-Filter,即布隆过滤器,1970年由Bloom中提出。它可以用于检索一个元素是否在一个集合中,其优点是空间效率和查询时间都远远超过其他算法,其不足在于Bloom- Filter存在着误判。 Continue reading →
php — No comments
21
八 11
XHprof介绍:
XHProf是一个分层PHP性能分析工具。 它报告函数级别的请求次数和各种指标,包括阻塞时间,CPU时间和内存使用情况。 Continue reading →
php内核 — No comments
13
八 11
/* mm block type */
typedef struct _zend_mm_block_info {
size_t _size; /* block的大小*/
size_t _prev; /* 计算前一个块有用到*/
} zend_mm_block_info;
typedef struct _zend_mm_block {
zend_mm_block_info info;
} zend_mm_block;
typedef struct _zend_mm_small_free_block { /* 双向链表 */
zend_mm_block_info info;
struct _zend_mm_free_block *prev_free_block; /* 前一个块 */
struct _zend_mm_free_block *next_free_block; /* 后一个块 */
} zend_mm_small_free_block; /* 小的空闲块*/
typedef struct _zend_mm_free_block { /* 双向链表 + 树结构 */
zend_mm_block_info info;
struct _zend_mm_free_block *prev_free_block; /* 前一个块 */
struct _zend_mm_free_block *next_free_block; /* 后一个块 */
struct _zend_mm_free_block **parent; /* 父结点 */
struct _zend_mm_free_block *child[2]; /* 两个子结点*/
} zend_mm_free_block;
struct _zend_mm_heap {
int use_zend_alloc; /* 是否使用zend内存管理器 */
void *(*_malloc)(size_t); /* 内存分配函数*/
void (*_free)(void*); /* 内存释放函数*/
void *(*_realloc)(void*, size_t);
size_t free_bitmap; /* 小块空闲内存标识 */
size_t large_free_bitmap; /* 大块空闲内存标识*/
size_t block_size; /* 一次内存分配的段大小,即ZEND_MM_SEG_SIZE指定的大小,默认为ZEND_MM_SEG_SIZE (256 * 1024)*/
size_t compact_size; /* 压缩操作边界值,为ZEND_MM_COMPACT指定大小,默认为 2 * 1024 * 1024*/
zend_mm_segment *segments_list; /* 段指针列表 */
zend_mm_storage *storage; /* 所调用的存储层 */
size_t real_size; /* 堆的真实大小 */
size_t real_peak; /* 堆真实大小的峰值 */
size_t limit; /* 堆的内存边界 */
size_t size; /* 堆大小 */
size_t peak; /* 堆大小的峰值*/
size_t reserve_size; /* 备用堆大小*/
void *reserve; /* 备用堆 */
int overflow; /* 内存溢出数*/
int internal;
#if ZEND_MM_CACHE
unsigned int cached; /* 已缓存大小 */
zend_mm_free_block *cache[ZEND_MM_NUM_BUCKETS]; /* 缓存数组/
#endif
zend_mm_free_block *free_buckets[ZEND_MM_NUM_BUCKETS*2]; /* 小块内存数组,相当索引的角色 */
zend_mm_free_block *large_free_buckets[ZEND_MM_NUM_BUCKETS]; /* 大块内存数组,相当索引的角色 */
zend_mm_free_block *rest_buckets[2]; /* 剩余内存数组*/
#if ZEND_MM_CACHE_STAT
struct {
int count;
int max_count;
int hit;
int miss;
} cache_stat[ZEND_MM_NUM_BUCKETS+1];
#endif
};
/* Heaps with user defined storage */
typedef struct _zend_mm_storage zend_mm_storage;
typedef struct _zend_mm_segment {
size_t size;
struct _zend_mm_segment *next_segment;
} zend_mm_segment;
typedef struct _zend_mm_mem_handlers {
const char *name;
zend_mm_storage* (*init)(void *params);
void (*dtor)(zend_mm_storage *storage);
zend_mm_segment* (*_alloc)(zend_mm_storage *storage, size_t size);
zend_mm_segment* (*_realloc)(zend_mm_storage *storage, zend_mm_segment *ptr, size_t size);
void (*_free)(zend_mm_storage *storage, zend_mm_segment *ptr);
} zend_mm_mem_handlers;
struct _zend_mm_storage {
const zend_mm_mem_handlers *handlers;
void *data;
};
更的内存相关内容介绍,可以参考:http://www.php-internal.com/
php — 2 comments
18
七 11
上次写了个 php扩展开发步骤,简单介绍了扩展函数的实现方法,最近有个朋友问到类扩展怎么实现,关于类扩展的示例,网上很少,于是写了个PHP类扩展的例子。
需要实现的类为:
class Vector2D
{
private $_x;
private $_y;
/**
* Constructor.
*/
public function __construct($x = 0, $y = 0)
{
$this->_x = $x;
$this->_y = $y;
}
/**
* Generates a copy of $this vector.
* @return Vector2D A copy of $this vector.
*/
public function mycopy()
{
return new Vector2D($this->_x, $this->_y);
}
/**
* Sets $this vector's x and y values, and thus length, to zero.
* @return Vector2D A reference to $this vector.
*/
public function zero()
{
$this->_x = 0;
$this->_y = 0;
return $this;
}
/**
* Whether or not $this vector is equal to zero, i.e. its x, y, and length are zero.
* @return Boolean True if vector is zero, otherwise false.
*/
public function isZero()
{
return $this->_x == 0 && $this->_y == 0;
}
public function getX()
{
return $this->_x;
}
public function getY()
{
return $this->_y;
}
}
环境:PHP 5.2.14 CentOS 5.5
Continue reading →
php — 1 comment
26
六 11
前段时间追查过php core,因为涉及公司代码,不能分析详细追查过程,这里分享下追查PHP core 简单的几个步骤,希望对大家有帮助。
1.首先, 用gdb打开这个core文件
gdb php-cgi core
2.查看core发生时的堆栈信息
(gdb) bt
3.查看函数调用信息
为了便于调试,先执行一个PHP提供的.gdbinit脚本
(gdb)source php-5.2.8/.gdbinit
(gdb)zbacktrace
然后查看其函数调用信息
3.查看函数调用参数
(gdb) f 0
进入到函数调用所在的栈
(gdb) p (int )*(executor_globals->argument_stack->top_element - 2)
查看参数个数
(gdb) p **(zval **)(executor_globals->argument_stack->top_element - 3)
查看最后一个参数的值
(gdb) p **(zval **)(executor_globals->argument_stack->top_element - 4)
查看倒数第二个参数的值
....
4.查看栈发生时页面请求信息,能看到当时请求的页面url,get、post请求参数、cookies信息等(cgi为例)
(gdb) p sapi_globals->request_info
一般通过上面几个步骤就能分析这个core的产生原因,大家可以试试。
详细可参考:http://www.laruence.com/2011/06/23/2057.html