现在nginx + fpm 基本成为主流的配置,其中我们比较关注的是pm.max_chindren的配置


首先,我们关注一个前提设置: pm = static/dynamic,

这个选项是标识fpm子进程的产生模式:

static :表示在fpm运行时直接fork出pm.max_chindren个worker进程,
dynamic:表示,运行时fork出start_servers个进程,随着负载的情况,动态的调整,最多不超过max_children个进程。

一般推荐用static,优点是不用动态的判断负载情况,提升性能,缺点是多占用些系统内存资源。

上面的告诉我们max_chindren代表的worker的进程数。普遍认为,这个配置越多能同时处理的并发也就越多,这是一个比较大的误区:

1) 查看了fpm的相关源码, 管理进程和worker进程是通过pipe进行数据通讯的。所以进程多了,增加进程管理的开销,系统进程切换的开销,更核心的是,能并发执行的fpm进程不会超过cpu个数。通过多开worker的个数来提升qps, 是错误的理解,不会说你多开了几个进程,就多出几个cpu来处理。

2) 但worker进程开少了,如果server比较繁忙的话,会导到nginx把数据打到fpm的时候,发现所有的woker都在工作中,没有空闲的worker来接受请求,从而导致502。

那worker数到底该怎么配置呢?

理论上woker进程数=cpu的个数是最合理的,但由于第2点的原因,可能每个worker都没处理完请求,这样,就会频现502了。但多开请求,只是说避免502,暂时把请求hang住,但这只是缓解之道,实际上这不但不会增加系统的并发,而且会加重系统的负荷,所以,设置一个合理的worker数就比较重要了。

天下武功,唯快不破,只有尽可能的提升程序的效率,把单个请求的时间压缩到最低,这样,单个worker的处理时间变短了,那在单位时间里能处理的请求自然就多了。

那么可以通过每个worker在单位时间内处理的请求数来预估max_children的个数。假如最大的一个请求的处理时间是100ms内,而在100ms之内同时有100个请求过来,那了理论上就需要配置100个worker进程,先把请求给hang住。

但最大的请求耗时可能会受很多外在的情况影响,不太好预估,其实这里有一个捷径,来配置你的max_children数, 就是你前期先把max_childnren设置成一个比较大的值,稳定运行一段时间后,观察fpm的status里的 max active processes 是多少,然后把max_children配置比他大一些就ok了。

希望这些文章能给大家有一些帮助。

转自王晶:http://www.guangla.com/post/2014-03-14/40061238121


map 是golang必备利器之一,通俗点说,就是一组组key=>value的集合,有点类似于java中的hashmap.

声明及创建:

var myMap = make(map[string] string, 100) //创建一个初始存储能力为100的map, key的类型是string 值的类型也是string

赋值:

myMap["key"] = "value"

删除:

delete(myMap, "key") (如果myMap == nil, 则会抛出异常)

查找:

value, ok := myMap["key"]

if ok { //找到了

}

全局的map在多个协程Goroutine写的时候会冲突:

var (
    myMap map[string]string 
    Mutex sync.Mutex
)
func main() {
    for i := 0; i < 1000; i++ {
        go func() {
            Mutex.Lock()
            // 注意如果协程是堵塞的,例如下面是for死循环,那么这个协程就永远不会退出,defer语法就永远不会被执行
            // defer Mutex.Unlock()
            myMap["key"] = "value"
            // 还是下面的写法比较好,反正map写完就解锁了
            Mutex.Unlock()
        }   
    }
}

命令: show processlist;

如果是root帐号,你能看到所有用户的当前连接。如果是其它普通帐号,只能看到自己占用的连接。

show processlist;只列出前100条,如果想全列出请使用show full processlist;

mysql> show processlist;

命令: show status;

命令:show status like '%下面变量%';

Aborted_clients 由于客户没有正确关闭连接已经死掉,已经放弃的连接数量。

Aborted_connects 尝试已经失败的MySQL服务器的连接的次数。

Connections 试图连接MySQL服务器的次数。

Created_tmp_tables 当执行语句时,已经被创造了的隐含临时表的数量。

Delayed_insert_threads 正在使用的延迟插入处理器线程的数量。

Delayed_writes 用INSERT DELAYED写入的行数。

Delayed_errors 用INSERT DELAYED写入的发生某些错误(可能重复键值)的行数。

Flush_commands 执行FLUSH命令的次数。

Handler_delete 请求从一张表中删除行的次数。

Handler_read_first 请求读入表中第一行的次数。

Handler_read_key 请求数字基于键读行。

Handler_read_next 请求读入基于一个键的一行的次数。

Handler_read_rnd 请求读入基于一个固定位置的一行的次数。

Handler_update 请求更新表中一行的次数。

Handler_write 请求向表中插入一行的次数。

Key_blocks_used 用于关键字缓存的块的数量。

Key_read_requests 请求从缓存读入一个键值的次数。

Key_reads 从磁盘物理读入一个键值的次数。

Key_write_requests 请求将一个关键字块写入缓存次数。

Key_writes 将一个键值块物理写入磁盘的次数。

Max_used_connections 同时使用的连接的最大数目。

Not_flushed_key_blocks 在键缓存中已经改变但是还没被清空到磁盘上的键块。

Not_flushed_delayed_rows 在INSERT DELAY队列中等待写入的行的数量。

Open_tables 打开表的数量。

Open_files 打开文件的数量。

Open_streams 打开流的数量(主要用于日志记载)

Opened_tables 已经打开的表的数量。

Questions 发往服务器的查询的数量。

Slow_queries 要花超过long_query_time时间的查询数量。

Threads_connected 当前打开的连接的数量。

Threads_running 不在睡眠的线程数量。

Uptime 服务器工作了多少秒。


1、整形到字符串:

var i int = 1

var s string

s = strconv.Itoa(i) 或者 s = FormatInt(int64(i), 10)

2、字符串到整形

var s string = "1"

var i int

i, err = strconv.Atoi(s) 或者 i, err = ParseInt(s, 10, 0)

3、字符串到float(32 / 64)

var s string = 1

var f float32

f, err = ParseFloat(s, 32)

float 64的时候将上面函数中的32转为64即可

4、整形到float或者float到整形

直接使用float32(i) 或者 int32(f) 直接进行转换即可

float 64或者int 64的时候将上面函数中的32转为64即可


pkill 进程名 

killall 进程名

kill -9 $(ps -ef|grep 进程名关键字|gawk '$0 !~/grep/ {print $2}' |tr -s '\n' ' ')

kill -9 $(pidof 进程名关键字)