Archive for the ‘Linux’ Category.

redhat5 和redhat6 root用户不同的ulimits

以前一直都是用redhat5,redhat6也处于测试阶段,当然也遇到了很多奇奇怪怪的问题,比如之前写的一篇博客,当时候是用root启动了mysqld_unsafe,在mysql的QPS到1W以上后,会出现ERROR 1135 (HY000): Can’t create a new thread (errno 11); 当时候的解决办法是用mysql用户来启动就解决了问题。但因为在系统重启后,如果用sudo  -u mysql来启动的话,脚本会被卡主。

这个问题今天得到了一个稍微深入一点的结论。

首先我们看看这个错误

ERROR 1135 (HY000): Can’t create a new thread (errno 11);
if you are not out of available memory,
you can consult the manual for a possible OS-dependent bug

google类似Can’t create a new thread的错误后,得到的结论是文件描述符不够用,检查了vim /etc/security/limits.conf   的设置,是正常的

vim /etc/security/limits.conf
得到的结果是
root    soft    nofile  65535
root    hard    nofile  65535
admin   soft    nofile  65535
admin   hard    nofile  65535
# End of file
mysql   soft    nproc   65536
mysql   hard    nproc   65536
mysql   soft    nofile  65535
mysql   hard    nofile  65535
但观察了sudo -u root bash -c " ulimit -a " 后,得到 max user processes   (-u) 1024
core file size          (blocks, -c) 0

data seg size           (kbytes, -d) unlimited

scheduling priority             (-e) 0

file size               (blocks, -f) unlimited

pending signals                 (-i) 385957

max locked memory       (kbytes, -l) 64

max memory size         (kbytes, -m) unlimited

open files                      (-n) 65535

pipe size            (512 bytes, -p) 8

POSIX message queues     (bytes, -q) 819200

real-time priority              (-r) 0

stack size              (kbytes, -s) 10240

cpu time               (seconds, -t) unlimited

max user processes              (-u) 1024

virtual memory          (kbytes, -v) unlimited

file locks                      (-x) unlimited
max user processes              (-u) 1024 和 sudo -u root bash -c " ulimit -u "  一样,都是得到1024的结果
sudo -u root bash -c " ulimit -u "
1024

而在redhat5里面,只要在/etc/security/limits.conf  设置了root    soft    nofile  65535 和root    hard    nofile  65535,对应的uilmit  -u 就会是65535.

和@维西v @tb天羽 搞了几个小时,依然没法成功修改root用户的 max user processes到65535 。后来发现了一篇文章 Know your limits (ulimits)  ,提及到redhat6新增了/etc/security/limits.d/90-nproc.conf,里面的内容是

# Default limit for number of user's processes to prevent

# accidental fork bombs.

# See rhbz #432903 for reasoning.

*          soft    nproc     1024

redhat6下面,root用户使用ulimit -u没法修改

* soft nproc 1024的意思是任何用户的最大max user processes为1024个,其他用户可以通过ulimit -u来修改 ,但root用户则修改不成功,我们这里看一个例子

[yingyuan.ydh@my031226 ~]$ cat /etc/security/limits.d/90-nproc.conf

# Default limit for number of user's processes to prevent

# accidental fork bombs.

# See rhbz #432903 for reasoning.


*          soft    nproc     1024

[yingyuan.ydh@my031226 ~]$ ulimit -u

1024

[yingyuan.ydh@my031226 ~]$ ulimit -u 65535

[yingyuan.ydh@my031226 ~]$ ulimit -u

65535

[yingyuan.ydh@my031226 ~]$ sudo -uroot bash -c " ulimit -u 65535"

[yingyuan.ydh@my031226 ~]$ sudo -uroot bash -c " ulimit -u "

1024

很明显,在redhat6的/etc/security/limits.d/90-nproc.conf限制下,个人用户可以修改ulimit-u,但root用户没法修改。 解下来,我们把etc/security/limits.d/90-nproc.conf改掉,会看到root的ulimit -u 可以修改成功

[yingyuan.ydh@my031226 ~]$ sudo -uroot bash -c " ulimit -u 65535"

[yingyuan.ydh@my031226 ~]$ sudo -uroot bash -c " ulimit -u "

65535

[yingyuan.ydh@my031226 ~]$ cat /etc/security/limits.d/90-nproc.conf

# Default limit for number of user's processes to prevent

# accidental fork bombs.

# See rhbz #432903 for reasoning.


*          soft    nproc     65535

结果

在成功修改了root用户的max user processes后,继续使用root用户启动mysqld_safe脚本,稳定运行了一个下午,一切正常。

思考

为什么redhat6要做新增一个文件的限制,而不是继续沿用redhat5的方式来管理? 在微博上面发了一条简单的描述,引起很多人的讨论。

http://weibo.com/1642466057/y3jM4cz3q

遭遇Linux进程状态D

在一台flashcache的机器上面跑stap脚本

global some_count
probe process(@1).function("*")
{
  some_count[tid()] = backtrace()
}

function print_top()
{
  foreach (tid+ in some_count)
  {
    print_stack(some_count[tid])
  }
}

probe timer.s(5)
{
  print_top()
  printf("—————————————————-\n")
}

跑了这个脚本,跑了一会就ctrl+c abort掉,但后台还是有一个D进程的程序,用了好几次kill -9也杀不掉

1 15466 15252 14863 ?           -1 D        0   0:00 /usr/libexec/systemtap/stapio -u /tmp/stapzHoiGc/stap_b2dc831605d82ca90db5b550e7dfd16a_24607.ko

在Linux里面,进程状态分为task_running,task_interruptiable,task_uninterruptiable,_task_traced _task_stopped

之前一直对task_uninterruptiable不是很理解,这次亲身经历后,对它的认识更加深入。

进程状态为D的进程,一直滞留在CPU run_queue里面,搞得我的其他进程都不能正常运行,尝试了kill –9 ,没办法杀掉。最后只能reboot解决

之所以命名为D,往往是因为I/O资源得不到满足而引发等待。

我们的备库依赖nas服务器来作为备份盘,今年遇到过好几次因为nas的问题,导致mysql的监控一直告警(监控程序需要连接到MySQL,但由于备份脚本因为在写nas的时候,nas在中途卸载掉了,导致脚本一直在等待nas就绪,必须得重新挂载nas才能解决)

 

image

CPU软中断实践一

最近在对一个MySQL项目进行性能测试 QPS在1.1W到1.5W之间波动,但通过tcprstat观察到,响应时间不是非常稳定,会从0.3ms波动到1.9ms

image

响应时间监控,avg代表的是平均响应时间,单位为微秒,这里可以看到,平均响应时间为0.3ms 到1.7ms之间波动

image

@淘宝褚霸 在帮忙分析的时候,给了三点建议 1.CPU 2.IO 3.内存 这里先从CPU使用优化来总结一下

1.首先定位系统的CPU占用是否正常,可以使用 命令 mpstat –P ALL  1image

我们可以看到第四颗CPU的idle百分比明显比其他CPU要低好多。那这颗CPU到底在忙什么事情?    perf top 工具可以帮我们查看,这颗CPU上面跑的进程的百分比

2. sudo perf top –cpu=4 image

输出的结果和oprofile相似,但perf top可以实时来做cpu采样,这点比oprofile要好使得多。

另外一个工具是 taskset ,例如 taskset -p 03 700  的意思是把pid为700的进程绑定到第四颗CPU上面

ERROR 1135 (HY000): Can’t create a new thread (errno 11)

在一台MySQL测试服务器上面,今天遇到了

ERROR 1135 (HY000): Can’t create a new thread (errno 11); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug

首先使用perror工具看一下 错误代码11代表的意思

perror 11
OS error code 11: Resource temporarily unavailable
资源暂时不可用
google搜索了一下,很多文章说和当前用户的文件描述符ulimit -n有关系
ulimit -n
65535
当时候mysql的服务器load 为0,自然不可能是文件描述符不够导致的问题
第二个检查操作 cat /etc/security/limits.conf
得到的结果是
root soft nofile 65535
root hard nofile 65535
admin soft nofile 65535
admin hard nofile 65535
# End of file
mysql soft nproc 65536
mysql hard nproc 65536
mysql soft nofile 65535
第三个检查操作 查看mysql的错误日志
有一个很奇怪的现象,我的mysql是一直跑着的,但错误日志只有前两天的

这个时候,在ps aux | grep mysql的输出中发现 -log-error=/var/log/mysqld.log ,错误日志输出到/var目录下面是不正常的
mysql     2086 35.1 37.1 51184004 18388068 ?   Sl   20:25   9:01 
/u01/mysql/bin/mysqld –basedir=/u01/mysql –datadir=/u01/mysql/data –plugin-dir=/u01/mysql/lib/plugin
 –user=mysql –log-error=/var/log/mysqld.log –open-files-limit=65535 –pid-file=/u01/mysql/run/mysqld.pid
 –socket=/u01/mysql/run/mysql.sock –port=3306

直觉告诉我mysql用了/etc/my.cnf的内容
/etc/my.cnf的内容
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

最终把mysqld_safe干掉后,用mysqld_safe –defaults-file=xx.cnf 重新指定my.cnf的位置,mysql就正常跑了
最终原因,@维西v 启动mysql的时候没有指定my.cnf的位置,所以导致mysqld_safe使用了/etc/my.cnf这个默认文件
但依然有问题不是很理解
1.为什么读了/etc/my.cnf的时候,mysqld还会继续使用my.cnf配置文件里面的/u01/mysql/data
2.为什么还会继续使用plugin-dir=/u01/mysql/lib/plugin

编译Percona MySQL 5.5 +Handler Socket

安装准备 Cmake wget http://service-spi.web.cern.ch/service-spi/external/tarFiles/cmake-2.6.4.tar.gz

Percona-Server-5.5.16-rel22.0  get http://www.percona.com/redir/downloads/Percona-Server-5.5/Percona-Server-5.5.16-22.0/source/Percona-Server-5.5.16-rel22.0.tar.gz

$tar zxf cmake-2.6.4.tar.gz
$cd cmake-2.6.4
$./bootstrap
$make
$sudo make install

tar zxvf  Percona-Server-5.5.15-rel22.0.tar.gz

cd  Percona-Server-5.5.15-rel22.0

执行 CFLAGS=”-O3″ CXX=gcc CXXFLAGS=”-O3 -felide-constructors -fno-exceptions -fno-rtti”

 

cmake . \
  -DCMAKE_BUILD_TYPE:STRING=Release             \
  -DSYSCONFDIR:PATH=/u01/mysql            \
  -DCMAKE_INSTALL_PREFIX:PATH=/u01/mysql  \
  -DENABLED_PROFILING:BOOL=ON                   \
  -DENABLE_DEBUG_SYNC:BOOL=OFF                  \
  -DMYSQL_DATADIR:PATH=/u01/mysql/data    \
  -DMYSQL_MAINTAINER_MODE:BOOL=OFF              \
  -DWITH_EXTRA_CHARSETS:STRING=utf8,gbk,gb2312  \
  -DWITH_BIG_TABLES:BOOL=ON \
  -DWITH_FAST_MUTEXES:BOOL=ON \
  -DENABLE-PROFILING:BOOL=ON \
  -DWITH_SSL:STRING=bundled                     \
  -DWITH_UNIT_TESTS:BOOL=OFF                    \
  -DWITH_ZLIB:STRING=bundled                    \
  -DWITH_PARTITION_STORAGE_ENGINE:BOOL=ON       \
  -DWITH_SERVER_SUFFIX=hxsw                        \
  -DWITH_PLUGINS=heap,csv,partition,innodb_plugin,myisam \
  -DDEFAULT_CHARSET=gbk -DDEFAULT_COLLATION=gbk_chinese_ci -DWITH_EXTRA_CHARSETS=ALL \
  -DENABLED_ASSEMBLER:BOOL=ON                   \
  -DENABLED_LOCAL_INFILE:BOOL=ON                \
  -DENABLED_THREAD_SAFE_CLIENT:BOOL=ON          \
  -DENABLED_EMBEDDED_SERVER:BOOL=OFF             \
  -DWITH_CLIENT_LDFLAGS:STRING=all-static                 \
  -DINSTALL_LAYOUT:STRING=STANDALONE            \
  -DCOMMUNITY_BUILD:BOOL=ON;
 make -j `cat /proc/cpuinfo  | grep processor | wc -l`
make install

执行/u01/mysql/scripts/mysql_install_db –basedir=/u01/mysql/

(安装mysql,test数据库,初始化权限)

启动MySQL /u01/mysql/bin/mysqld_safe –defaults-file=my.cnf &

(my.cnf 请参考/u01/pmysql/support-files 下面的 my-innodb-heavy-4G.cnf文件 )

启动MySQL后,登录后

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.5.16-log MySQL Community Server (GPL)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| test               |
+--------------------+
4 rows in set (0.00 sec)

恭喜你,已经安装成功了!

编译Handler Socket

cd Percona-Server-5.5.16-rel22.0/storage/HandlerSocket-Plugin-for-MySQL

./configure  –with-mysql-source=/home/xxx/Percona-Server-5.5.15-rel21.0 \

–with-mysql-bindir=/u01/mysql/bin/ –with-mysql-plugindir=/u01/mysql/lib/plugin

 

make -j `cat /proc/cpuinfo  | grep processor | wc -l`

make install

登录到MySQL

mysql>  INSTALL PLUGIN handlersocket SONAME ‘handlersocket.so’;

mysql> show plugins;

+--------------------------------+----------+--------------------+------------------+---------+
| Name                           | Status   | Type               | Library          | License |
+--------------------------------+----------+--------------------+------------------+---------+
| binlog                         | ACTIVE   | STORAGE ENGINE     | NULL             | GPL     |
| mysql_native_password          | ACTIVE   | AUTHENTICATION     | NULL             | GPL     |
| mysql_old_password             | ACTIVE   | AUTHENTICATION     | NULL             | GPL     |
| MRG_MYISAM                     | ACTIVE   | STORAGE ENGINE     | NULL             | GPL     |
| MEMORY                         | ACTIVE   | STORAGE ENGINE     | NULL             | GPL     |
| MyISAM                         | ACTIVE   | STORAGE ENGINE     | NULL             | GPL     |
| CSV                            | ACTIVE   | STORAGE ENGINE     | NULL             | GPL     |
| BLACKHOLE                      | ACTIVE   | STORAGE ENGINE     | NULL             | GPL     |
| InnoDB                         | ACTIVE   | STORAGE ENGINE     | NULL             | GPL     |
| INNODB_RSEG                    | ACTIVE   | INFORMATION SCHEMA | NULL             | GPL     |
| INNODB_TRX                     | ACTIVE   | INFORMATION SCHEMA | NULL             | GPL     |
| INNODB_LOCKS                   | ACTIVE   | INFORMATION SCHEMA | NULL             | GPL     |
| INNODB_LOCK_WAITS              | ACTIVE   | INFORMATION SCHEMA | NULL             | GPL     |
| INNODB_CMP                     | ACTIVE   | INFORMATION SCHEMA | NULL             | GPL     |
| INNODB_CMP_RESET               | ACTIVE   | INFORMATION SCHEMA | NULL             | GPL     |
| INNODB_CMPMEM                  | ACTIVE   | INFORMATION SCHEMA | NULL             | GPL     |
| INNODB_CMPMEM_RESET            | ACTIVE   | INFORMATION SCHEMA | NULL             | GPL     |
| INNODB_SYS_TABLES              | ACTIVE   | INFORMATION SCHEMA | NULL             | GPL     |
| INNODB_SYS_TABLESTATS          | ACTIVE   | INFORMATION SCHEMA | NULL             | GPL     |
| INNODB_SYS_INDEXES             | ACTIVE   | INFORMATION SCHEMA | NULL             | GPL     |
| INNODB_SYS_COLUMNS             | ACTIVE   | INFORMATION SCHEMA | NULL             | GPL     |
| INNODB_SYS_FIELDS              | ACTIVE   | INFORMATION SCHEMA | NULL             | GPL     |
| INNODB_SYS_FOREIGN             | ACTIVE   | INFORMATION SCHEMA | NULL             | GPL     |
| INNODB_SYS_FOREIGN_COLS        | ACTIVE   | INFORMATION SCHEMA | NULL             | GPL     |
| INNODB_SYS_STATS               | ACTIVE   | INFORMATION SCHEMA | NULL             | GPL     |
| INNODB_TABLE_STATS             | ACTIVE   | INFORMATION SCHEMA | NULL             | GPL     |
| INNODB_INDEX_STATS             | ACTIVE   | INFORMATION SCHEMA | NULL             | GPL     |
| INNODB_BUFFER_POOL_PAGES       | ACTIVE   | INFORMATION SCHEMA | NULL             | GPL     |
| INNODB_BUFFER_POOL_PAGES_INDEX | ACTIVE   | INFORMATION SCHEMA | NULL             | GPL     |
| INNODB_BUFFER_POOL_PAGES_BLOB  | ACTIVE   | INFORMATION SCHEMA | NULL             | GPL     |
| XTRADB_ADMIN_COMMAND           | ACTIVE   | INFORMATION SCHEMA | NULL             | GPL     |
| FEDERATED                      | DISABLED | STORAGE ENGINE     | NULL             | GPL     |
| ARCHIVE                        | ACTIVE   | STORAGE ENGINE     | NULL             | GPL     |
| PERFORMANCE_SCHEMA             | ACTIVE   | STORAGE ENGINE     | NULL             | GPL     |
| partition                      | ACTIVE   | STORAGE ENGINE     | NULL             | GPL     |
| handlersocket                  | ACTIVE   | DAEMON             | handlersocket.so | BSD     |
+--------------------------------+----------+--------------------+------------------+---------+
36 rows in set (0.00 sec)

参考资料 Cmake使用   http://forge.mysql.com/wiki/Autotools_to_CMake_Transition_Guide

 

 

 

binlog_format=ROW/STATEMENT/MIX 对记录不存在的对比

昨天一台(slave)不停的出现包含HA_ERR_KEY_NOT_FOUND的复制错误

  1. Include/my_base.sh (376行)  #define HA_ERR_KEY_NOT_FOUND    120     /* Didn’t find key on read or update */

翻译的意思是查询或者更新操作找不到键值,实际进行测试的时候 ,where查询条件为索引和普通列值的时候,当主库binlog_format=row的时候,slave也会报错HA_ERR_KEY_NOT_FOUND

改slave对应的主库binlog_format=ROW

  1. 2. 测试重现

v031082.sqa.cm4   搞两个mysql实例   做主备

主库 /u01/mysql 3306    binlog_format=ROW

备库 /u01/mysql2 3309  binlog_format=STATEMENT

主库 create table t1(id int ,name varchar(100);

Insert into table t1 (name) value (‘mysql’);

Insert into table t1 (name) value (‘hbase’);

Insert into table t1 (name) value (‘oracle’);

主备库确认三条记录都在,备库清空t1表 .

备库 show slave status\G无告警

ROWSTATEMENT的类似操作对比

MySQL 主库 Binlog_format=row 主库的binlog_format=MIX/statement;
v031082.sqa.cm4 3306 Master delete from t1 where ;

delete from t1 where name=’hbase’;

Delete from t1 where name=’mysql’
v031082.sqa.cm4 3309 Slave 备库此时show slave status ;会出现

Could not execute Update_rows event on table test.t1;

Can’t find record in ‘t1′, Error_code: 1032;

handler error HA_ERR_KEY_NOT_FOUND;

the event’s master log mysql-bin.000001, end_log_pos 3499

备库没有错误信息 (目前线上大部分的MySQL 主库binlog_format=statement,如果TC迁移到MySQL,需要考虑好到底是采用MIX还是ROW)

源码剖析

storage/innodb_plugin/handler/ha_innodb.cc 这里包含index_read(),index_first(),index_last()函数,这些函数都会判断记录是否存在

/**********************************************************************//**

Positions an index cursor to the index specified in the handle. Fetches the

row if any.

@return  0, HA_ERR_KEY_NOT_FOUND, or error number */

UNIV_INTERN

Int ha_innobase::index_read(

case DB_RECORD_NOT_FOUND:

error = HA_ERR_KEY_NOT_FOUND;

table->status = STATUS_NOT_FOUND;

break;

}

/********************************************************************//**

Positions a cursor on the first record in an index and reads the

corresponding row to buf.

@return 0, HA_ERR_END_OF_FILE, or error code */

UNIV_INTERN Int ha_innobase::index_first(

if (error == HA_ERR_KEY_NOT_FOUND) {

error = HA_ERR_END_OF_FILE;

}

)

/********************************************************************//**

Positions a cursor on the last record in an index and reads the

corresponding row to buf.

@return 0, HA_ERR_END_OF_FILE, or error code */

UNIV_INTERN  int  ha_innobase::index_last(

if (error == HA_ERR_KEY_NOT_FOUND) {

error = HA_ERR_END_OF_FILE;

}

)

MySQL5.5.4InnoDB Plugin 新特性&改进

http://dev.mysql.com/doc/innodb-plugin/1.1/en/innodb-performance.html

mysql5.5.4的innodb增加了很多特性 希望在oracle里面,mysql可以继续走下去

查询MySQL已有的用户的三种方法

查询MySQL已有的用户的方法
mysql -h ip -uroot -p123 -e ” 放以下的查询”
select * from mysql.User \G
select distinct(User) from mysql.user;

select db,host,user from mysql.User

对于MySQL DBA 来说,查阅mysql的用户信息是最平常不过的操作了,这里提供几种方法查看

mysql -h ip -uroot -p123 -e ” 放以下的查询”

select * from mysql.User \G

select distinct(User) from mysql.user;

select db,host,user from mysql.User

python 使用OptionParser的时候使用中文出错的解决过程

今天在使用OptionParser的时候,在填写帮助信息的时候使用了中文,却发现报了一系列的错误
代码如下
#!/usr/bin/env python
#coding:UTF-8
import ConfigParser,sys
try:
from optparse import OptionParser
except ImportError:
try:
from optik import OptionParser
except ImportError:
raise ImportError, ‘Requires Python 2.3 or the Optik option parsing library.’
parser = OptionParser()
parser.add_option(“-f”,”–file”,dest=”name”,
help=”帮助信息”,metavar=”FILE”)
parser.add_option(“-q”,”–quit”,
action =”store_false”,dest=”verbose”,default=”True”,
help=”帮助信息”)
(options,args) = parser.parse_args()
错误信息
File “get-parser-cn.py”, line 23, in <module>
(options,args) = parser.parse_args()
File “/usr/lib/python2.5/optparse.py”, line 1387, in parse_args
stop = self._process_args(largs, rargs, values)
File “/usr/lib/python2.5/optparse.py”, line 1431, in _process_args
self._process_short_opts(rargs, values)
File “/usr/lib/python2.5/optparse.py”, line 1538, in _process_short_opts
option.process(opt, value, values, self)
File “/usr/lib/python2.5/optparse.py”, line 774, in process
self.action, self.dest, opt, value, values, parser)
File “/usr/lib/python2.5/optparse.py”, line 796, in take_action
parser.print_help()
File “/usr/lib/python2.5/optparse.py”, line 1657, in print_help
file.write(self.format_help().encode(encoding, “replace”))
UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe5 in position 124: ordinal not in range(128)
和 @smallfish9 同学 讨论了一番,并搜索了一些资料后,找到了解决方案如下
import sys
reload(sys) # Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入 ,可以注释掉来试试,会提示没有这个setdefaultencoding方法的
#!/usr/bin/env python
#coding:UTF-8
import ConfigParser,sys
reload(sys)
print sys.getdefaultencoding()
sys.setdefaultencoding(‘utf-8′)
try:
from optparse import OptionParser
except ImportError:
try:
from optik import OptionParser
except ImportError:
raise ImportError, ‘Requires Python 2.3 or the Optik option parsing library.’
parser = OptionParser()
parser.add_option(“-f”,”–file”,dest=”name”,
help=”帮助信息”,metavar=”FILE”)
parser.add_option(“-q”,”–quit”,
action =”store_false”,dest=”verbose”,default=”True”,
help=”帮助信息”)
(options,args) = parser.parse_args()
再进行 python  get-parser-cn.py -h 的时候,可爱的中文就出来了

今天在使用OptionParser的时候,在填写帮助信息的时候使用了中文,却发现报了一系列的错误

代码如下

#!/usr/bin/env python

#coding:UTF-8

import sys

from optparse import OptionParser

parser = OptionParser()

parser.add_option(“-f”,”–file”,dest=”name”,help=”帮助信息”,metavar=”FILE”)

(options,args) = parser.parse_args()

错误信息

File “get-parser-cn.py”, line 23, in <module>

(options,args) = parser.parse_args()

File “/usr/lib/python2.5/optparse.py”, line 1387, in parse_args

stop = self._process_args(largs, rargs, values)

File “/usr/lib/python2.5/optparse.py”, line 1431, in _process_args

self._process_short_opts(rargs, values)

File “/usr/lib/python2.5/optparse.py”, line 1538, in _process_short_opts

option.process(opt, value, values, self)

File “/usr/lib/python2.5/optparse.py”, line 774, in process

self.action, self.dest, opt, value, values, parser)

File “/usr/lib/python2.5/optparse.py”, line 796, in take_action

parser.print_help()

File “/usr/lib/python2.5/optparse.py”, line 1657, in print_help

file.write(self.format_help().encode(encoding, “replace”))

UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe5 in position 124: ordinal not in range(128)

和 @smallfish9 同学 讨论了一番,并搜索了一些资料后,找到了解决方案如下

import sys

reload(sys) # Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入 ,可以注释掉来试试,会提示没有这个setdefaultencoding方法的

完整的代码

#!/usr/bin/env python

#coding:UTF-8

import sys

from optparse import OptionParser

reload(sys)

print sys.getdefaultencoding()

sys.setdefaultencoding(‘utf-8′)

parser = OptionParser()

parser.add_option(“-f”,”–file”,dest=”name”,

help=”帮助信息”,metavar=”FILE”)

(options,args) = parser.parse_args()

再进行 python  get-parser-cn.py -h 的时候,可爱的中文就出来了

Slave落后于Master的检查步骤

前两天一直好好的master-slave,突然出现了几个slave复制严重落后于master的情况,在CU的论坛发了个帖子问大伙slave落后于master的原因分析,一哥们给的答复很专业
“落后的原因一般是master的写压力比较大,因为mysql的同步使用两个线程,一个读取bin-log,一个应用这些log,但是master上一般是多个线程写,所以压力大的时候,会造成从服务器一个线程写入不能及时完成,就会造成落后master了
再后来和公司的前辈讨论了下,总结了如下几个检查步骤
1. 在slave 执行show full processlist ,这个是最直接的方法,发现了Master端对一个大表的某个字段执行了update操作
2. 使用iostat来检查slave的io负载情况(也就是上面那哥们所说的写操作的检查了)

前两天一直好好的master-slave,突然出现了几个slave复制严重落后于master的情况,在CU的论坛发了个帖子问大伙slave落后于master的原因分析,一哥们给的答复很专业

“落后的原因一般是master的写压力比较大,因为mysql的同步使用两个线程,一个读取bin-log,一个应用这些log,但是master上一般是多个线程写,所以压力大的时候,会造成从服务器一个线程写入不能及时完成,就会造成落后master了

再后来和公司的前辈讨论了下,总结了如下几个检查步骤

1. 在slave 执行show full processlist ,这个是最直接的方法,发现了Master端对一个大表的某个字段执行了update操作

2. 使用iostat来检查slave的io负载情况(也就是上面那哥们所说的写操作的检查了)