一般来讲,如果要测A机器到B机器的网速,很可能会scp传一个大文件,但是这样显得不够专业,而且可能受到硬盘读写速度的限制,正确的测速姿势为:
A机器上:
1 |
nc -l 1234 >/dev/null |
B机器上:
1 |
dd if=/dev/zero of=/dev/stdout bs=10M count=100000|nc $ip_of_B 1234 |
DevOps
一般来讲,如果要测A机器到B机器的网速,很可能会scp传一个大文件,但是这样显得不够专业,而且可能受到硬盘读写速度的限制,正确的测速姿势为:
A机器上:
1 |
nc -l 1234 >/dev/null |
B机器上:
1 |
dd if=/dev/zero of=/dev/stdout bs=10M count=100000|nc $ip_of_B 1234 |
max_allowed_packet 定义的是所允许的单条sql语句的大小。
引用官方的说法:http://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_max_allowed_packet
You must increase this value if you are using large BLOB
columns or long strings. It should be as big as the largest BLOB
you want to use. The protocol limit for max_allowed_packet
is 1GB. The value should be a multiple of 1024; nonmultiples are rounded down to the nearest multiple.
解释一下:
1 |
set global max_allowed_packet=100*1024*1024; |
一大早到公司,加班一宿的同事就跟我抱怨,说,一个表只有8w条数据,需要更新一列,根据目前进度估算,大概需要3个小时,即使不需要更新,查询每条数据也需要400ms左右;
或许确实配置太低,或许确实表的字段太多,我并没有过于吃惊,但是3小时确实太多,便一起查了一下:
分析:
因为aa是varchar类型,如果要和一个数字比较,势必要对aa进行转换,如此就用不到索引了;这种错误太容易出现了
一条命令:
1 |
dd if=/dev/zero of=/dev/null bs=1G count=1 && echo succ |
如果要持续占用一段时间呢?
1 |
dd if=/dev/zero of=/dev/null bs=1G count=1 | sleep 1000 |
能否把1G的数据保存到shell的变量中呢?
1 |
$ a=$(dd if=/dev/zero of=/dev/stdout bs=1G count=1) |
测试是不行的,可能是太大了吧
docker命令行会有一系列的操作容器的方法,如: create 、run、start、exec等等,这些都是通过docker daemon的sock文件由docker daemon实现的,那么docker daemon又是如何实现的呢?
docker-runc就是最终执行的程序,docker-runc也提供了一系列类似于docker的操作,如: create、start、run、exec等,当然,也不完全一样;docker-runc exec的时候可以指定环境变量、进程的能力等,所以,我们可以直接使用docker-runc来在已有的容器内部执行命令,需要注意的是,docker create时定义的环境变量需要通过选项指定,因为docker-runc不知道这些(奇怪的是,预定义的进程的能力似乎是知道的)
下图是一个容器中的进程:
PHP 输出错误时的堆栈情况:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#0 php_error_cb (type=1, error_filename=0x7ffff7fdbaf0 "/data3/eatmem.php", error_lineno=3, format=<value optimized out>, args=<value optimized out>) at /data3/rpmbuild/SOURCES/beebank-php5-5.5.25.1/main/main.c:1132 #1 0x00000000006ae29c in zend_error (type=1, format=0xb09580 "Allowed memory size of %ld bytes exhausted (tried to allocate %lu bytes)") at /data3/rpmbuild/SOURCES/beebank-php5-5.5.25.1/Zend/zend.c:1128 #2 0x0000000000687848 in zend_mm_safe_error (heap=0xe2f050, format=0xb09580 "Allowed memory size of %ld bytes exhausted (tried to allocate %lu bytes)", limit=1048576, size=2048001) at /data3/rpmbuild/SOURCES/beebank-php5-5.5.25.1/Zend/zend_alloc.c:1777 #3 0x00000000006884e6 in _zend_mm_alloc_int (heap=0xe2f050, size=2048001) at /data3/rpmbuild/SOURCES/beebank-php5-5.5.25.1/Zend/zend_alloc.c:1980 #4 0x000000000061195b in zif_str_repeat (ht=<value optimized out>, return_value=0x7ffff7fdb058, return_value_ptr=<value optimized out>, this_ptr=<value optimized out>, return_value_used=<value optimized out>) at /data3/rpmbuild/SOURCES/beebank-php5-5.5.25.1/ext/standard/string.c:4917 #5 0x000000000073070b in zend_do_fcall_common_helper_SPEC (execute_data=<value optimized out>) at /data3/rpmbuild/SOURCES/beebank-php5-5.5.25.1/Zend/zend_vm_execute.h:550 #6 0x0000000000721f50 in execute_ex (execute_data=0x7ffff7fa8210) at /data3/rpmbuild/SOURCES/beebank-php5-5.5.25.1/Zend/zend_vm_execute.h:363 #7 0x00000000006ad719 in zend_execute_scripts (type=8, retval=0x0, file_count=3) at /data3/rpmbuild/SOURCES/beebank-php5-5.5.25.1/Zend/zend.c:1327 #8 0x000000000064ef7a in php_execute_script (primary_file=0x7fffffffe070) at /data3/rpmbuild/SOURCES/beebank-php5-5.5.25.1/main/main.c:2525 #9 0x000000000075fdbc in do_cli (argc=6, argv=0xe2ec30) at /data3/rpmbuild/SOURCES/beebank-php5-5.5.25.1/sapi/cli/php_cli.c:994 #10 0x0000000000760558 in main (argc=6, argv=0xe2ec30) at /data3/rpmbuild/SOURCES/beebank-php5-5.5.25.1/sapi/cli/php_cli.c:1378 |
如果需要添加更多的信息,只需要在php_error_cb 函数里面添加就行了
且看一个demo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
int do_sth(int type) { char *errstr; switch(type) { case 1: errstr = "Error";break case 2: errstr = "Warn";break case 3: errstr = "Info";break case 4: errstr = "Debug";break default: return 0; } if (...) {..} if (...) { ..; fprintf(stdout, "%s %s", errstr, ...); return 1; } if (...) { return 1;} if (...) { fprintf(stderr, "%s %s", errstr, ...); } ... return 0; } |
问题: 如何在errstr信息前面添加一个HOSTNAME 环境变量信息?
如果是在脚本语言或者带有gc的语言中,完全可以直接在errstr变量前面拼接那个动态获取到的环境变量,如:
1 |
errstr=getenv("HOSTNAME") + errstr ; |
但是c中却不能这样,为什么呢?字符串拼接的函数不是有的吗,如:strcat;
事实却并非如此简单,为什么呢?
上面的errstr变量是存储在栈上的,不需要考虑free的问题,原作者考虑到后续一大堆复杂的if分支,如果把errstr放在堆上,处处要考虑是不是该把errstr free掉,得死多少脑细胞啊!
对于HOSTNAME是个运行时的信息,显然没法放到栈上,如果非要和errstr拼接起来的话,errstr必须在堆上,即要动态的malloc,由此可见,对于脚本语言来讲,一个非常简单的逻辑,在C中却如此的麻烦
解决办法:
我们知道,nginx的reload是不会影响服务的,php-fpm也有reload 功能,而且确实不是restart,但是却是影响服务的,下面给出一种改进方式,是的php-fpm的reload不影响服务
修改源代码:
重写init脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
#! /bin/sh ### BEGIN INIT INFO # Provides: php-fpm # Required-Start: $remote_fs $network # Required-Stop: $remote_fs $network # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: starts php-fpm # Description: starts the PHP FastCGI Process Manager daemon ### END INIT INFO php_fpm_BIN=/usr/sbin/php-fpm php_fpm_CONF=/etc/php/php-fpm.conf php_fpm_PID=/var/run/php-fpm.pid tmp_pid=/var/run/php-fpm.tmp.pid php_opts="--fpm-config $php_fpm_CONF --pid $tmp_pid" wait_for_pid () { local pid=$1 while kill -0 $pid >/dev/null 2>&1 ; do sleep 1; done } case "$1" in start) echo -n "Starting php-fpm " $php_fpm_BIN --daemonize $php_opts if [ "$?" != 0 ] ; then echo " failed" exit 1 fi cat $tmp_pid >$php_fpm_PID echo " done" ;; stop) echo -n "Gracefully shutting down php-fpm " if [ ! -r $php_fpm_PID ] ; then echo "warning, no pid file found - php-fpm is not running ?" exit 1 fi pid=$(cat $php_fpm_PID) kill -QUIT $pid wait_for_pid $pid echo " done" ;; status) if [ ! -r $php_fpm_PID ] ; then echo "php-fpm is stopped" exit 0 fi PID=`cat $php_fpm_PID` if ps -p $PID | grep -q $PID; then echo "php-fpm (pid $PID) is running..." else echo "php-fpm dead but pid file exists" fi ;; force-quit) echo -n "Terminating php-fpm " if [ ! -r $php_fpm_PID ] ; then echo "warning, no pid file found - php-fpm is not running ?" exit 1 fi pid=$(cat $php_fpm_PID) kill -TERM $pid wait_for_pid $pid echo " done" ;; restart) $0 stop $0 start ;; reload) echo -n "Reload service php-fpm " if [ ! -r $php_fpm_PID ] ; then echo "warning, no pid file found - php-fpm is not running ?" exit 1 fi pid=$(cat $php_fpm_PID) error=$($0 start >/dev/null) [[ "$error" != "" ]] && echo $error && exit 1 kill -QUIT $pid # 这里等待该pid似乎也不太好 echo " done" ;; configtest) $php_fpm_BIN -t ;; *) echo "Usage: $0 {start|stop|force-quit|restart|reload|status|configtest}" exit 1 ;; esac |
注意:
长连接(也叫持久连接)是啥?
对于PHP来讲,如果是运行在web模式,每次请求完成,php会回收所有需要的申请的资源,但是也可以申请一些特殊的资源,php可以不回收,比如:长连接。
优点: 长连接省却了每次连接的麻烦,也有效减少了timewait的数量
长连接真的好吗?
鉴于上面两点,感觉长连接真的好鸡肋