8月 152018
 

现象

php 进程: THREAD_PHP_RD_\Service\Process\Deploy 不干活了,进程堆栈如下:

4个cli进程都阻塞在了这里;

大概意思为,PHP要回写session,先要一些其它交互,期望能读一行,但是,怎么也读不够一行,于是就死等

问题1:

如果没有什么意外的话,不应该让死等

问题2:

debug发现,这个stream的数据结构中,设置的超时时间为86400秒:

难怪一直阻塞住不干活。

 

解决办法:

添加超时时间的配置:

 

问题:

你问我gdb的时候是如何知道stream中如何获取超时时间的?如何知道stream->abstract 的真实数据类型的?

翻代码看到的:

 

注: 还以为此事为偶发,进程刚刚工作几个小时就全部进入到了这个场景了,还好我解决了; 其实,这并没有找到问题的根源,不找到原因的话,后续会有更加莫名其妙的的事情发生的

 

Redis 版本号

(然而现在该扩展已经开发到了4.x.y 了

 Posted by at 上午 11:43
5月 152018
 

代码功能:

同时执行多条命令,花费时间接近于最长那条命令的时间,而不是每条命令执行的时间和。

 

 Posted by at 下午 5:17
11月 152017
 

gops用来查看系统中存在的go进程。

注意事项:

gops有可能没发现你的go进程:

一方面可能进程是藏在容器中的,在宿主机上gops就发现不了

另一种情况,就是gops参考的是进程文件的特征,该特征在不同go版本可能不一样,比如,我的gops能发现go 1.11的go进程,就发现不了go 1.14的go进程

如下:

gops能list出来系统中的go进程,如果内置了agent的话,还能添加个星号,带星号的进程可以进行深度的分析(因为有agent呀)

那么,gops是如何找到所有go进程,又是如何识别出来agent的呢?

关键代码是这么写的:

 

  1. 拿到所有的系统进程
  2. 分析进程文件可以检测是否go进程
  3. 在进程的用户目录下查找 .config/gops/{$pid}  文件,如果存在,就认为是有内置了agent了,该文件中存放的是agentlisten的端口号

如下:

 Posted by at 下午 4:04
8月 242017
 

Python web开发框架:

Django 、Flask、Tornado、Bottle、Twisted

 

Tornado: http://www.tornadoweb.org/en/stable/

Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed.

 

Twisted: https://pypi.python.org/pypi/Twisted/     http://twistedmatrix.com/trac/

An asynchronous networking framework written in Python

 

twisted/tornado 更是一个server,框架部分只是方便使用该server而附带的,不是重点;你可以选择使用tornado server + Django框架, 而对于Bottle框架而言,是允许指定使用哪种server的,支持的server有:

Bottle默认使用的server为: 如下:

所以,有些技术不是同一个层面的,不能相提并论,非此即彼;

 

Django or Flask:

https://www.zhihu.com/question/33538127

 

http://bottlepy.org/docs/dev/index.html

 

http://www.cnblogs.com/suzhigang/p/6208244.html

 Posted by at 下午 3:40
8月 222017
 

问题:

当我们在logstash-output-syslog中配置facility为local6的时候,实际上走的是local4;而定义facility为local7的时候,实际上走的是local5,但是,定义为daemon的时候,确实是daemon

原因:

  1. 参考源码: https://github.com/phpor/logstash-output-syslog/blob/master/lib/logstash/outputs/syslog.rb 关于facility的定义有一个数组:

    而rfc中的定义如下: https://tools.ietf.org/html/rfc3164#section-4.1.1



    我们发现,4和10的定义是重复的,9和15的定义是重复的; 而插件源码中把这两个重复的条目就简单去掉了,于是就导致facility-code就对不上了
  2. 解决办法: 把重复的两项补回去就可以了
 Posted by at 上午 10:05
8月 022017
 

 

syntax: headers = ngx.resp.get_headers(max_headers?, raw?)

context: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, balancer_by_lua*

Returns a Lua table holding all the current response headers for the current request.

This function has the same signature as ngx.req.get_headers except getting response headers instead of request headers.

 

参考: https://github.com/openresty/lua-nginx-module#ngxrespget_headers

注意: 字段名都会转换成小写

 Posted by at 下午 2:27
7月 182017
 

示例:

上面是 golang.org/x/net/proxy/direct.go 里面的代码

  1. 我们显然是可以在proxy包外访问到Direct变量的
  2. 我们显然是无法在proxy包外new 一个 direct 结构变量的
  3. 由于2,而且我们无法改变Direct的变量类型,所以,我们做不到给Direct进行重新赋值
 Posted by at 下午 12:03
6月 072017
 

如下,获取数组中的前2个元素:

难道还有更方便的方法?

 Posted by at 下午 2:41
4月 102017
 

在PHP没有协程的时候,我们也玩过并发多线程,但是,对于结果的实时处理就没那么方便了(尽管也可以实现),有了协程之后,代码看起来就会舒服许多,参考下面的multi_cmd.php

 

multi_cmd.php :

我们见到的更多的可能是并发执行多个任务,每个任务都完成后(如: curl异步多请求)在一并处理结果,如果处理结果本身也是需要时间的话,就会比较浪费时间,如果能完成一个处理一个的结果,效果会好一些

 

上面脚本存在瑕疵:

1、为了避免某个流阻塞整个进程,上面使用了非阻塞;但是,后面的死循环却导致了大量cpu的占用,所以,考虑使用stream_select会更好一些

2、为了能控制并发数就更好了,并发太大也可能不是好事

 

改进的脚本如下:

 

注意:

在使用stream_select 的时候, 是否阻塞也就不重要了? 也不完全,加入其中一个比较靠前的任务执行时间很长,就算第一批的大部分任务执行时间都很短,也会因为fread而阻塞在执行时间长的任务身上而无法快速完成其它任务,进而加入更多的任务; 所以,这里可能的办法有:

  1. 办法一:给stderr和stdout添加read timeout限制,但是测试发现,stream_set_timeout 给这两个流添加超时时间是失败的,stream_set_timeout 返回false
  2. 办法二:依然使用非阻塞模式, 依然不行,尽管stream_set_blocking(stdout, false) 返回true,也是无效的
  3. 注意:

    也就是说仅有的两个函数都是不能用的,也就是说,不是函数不行,而是,这事儿就不可行
 Posted by at 下午 12:54