proxy p2p

Mar 19th,2020 No Comments
内网服务S -> 外网机器P -> 终端C

kcp协议: 求快不求量 https://github.com/skywind3000/kcp
kcptun: 基于 kcp-go做的高速远程端口转发(隧道),做的是P->C的事 https://github.com/xtaci/kcptun
frp: 高性能内网穿透的反向代理软件,可将将内网服务暴露映射到外网服务器,做的是S->P的事   https://github.com/fatedier/frp
udp2raw-tunnel:  udp被qos问题,这个把udp伪装tcp https://github.com/wangyu-/udp2raw-tunnel
zerotier: https://www.zerotier.com/  p2p平台
SAKURA FRP: https://www.natfrp.com/  基于frp 端口转发平台
测试nat类型
https://github.com/jtriley/pystun
yum -y install epel-release
yum -y install python-pip
pip install pystun
pystun

https://blog.csdn.net/hanghangaidoudou/article/details/60961728
以下两个环境不能打洞
Port Restricted Cone NAT 与 Symmetric NAT
Symmetric NAT 与 Symmetric NAT

https://apple.stackexchange.com/questions/98331/can-i-connect-to-a-local-smb-share
mac不能用127.0.0.1
sudo ifconfig lo0 127.0.0.2 alias up 

Centos 7 环境相关

Oct 15th,2015 No Comments
# init
yum -y install net-tools
yum -y install vim 
yum -y install wget 
yum -y install zip unzip 
yum -y install bzip2 
yum -y install autoconf
yum -y install screen
yum -y install fonts-tweak-tool
# c/c++
yum -y install gcc-c++ libstdc++-devel 
# java
yum -y install java-1.7.0-openjdk* -y 

# disable selinux
/etc/sysconfig/selinux

# 关闭防火墙&关闭开机启动
systemctl stop firewalld.service
systemctl disable firewalld.service

# develop tools
yum groupinstall "Development Tools"

# erlang wxWidgets 支持
# 是否安装:which wx-config && wx-config --version-full 
yum -y install mesa-libGL-devel 
yum -y install mesa-libGLU-devel
yum -y install gtk2-devel
wxWidgets-3.0.2/configure --with-opengl --enable-debug --enable-unicode

# erlang 
yum -y install openssl-devel
yum -y install ncurses-devel 

# perl Unix::Syslog
yum install cpan
perl -MCPAN -e shell
install Unix::Syslog

 

Ejabber 压力测试

Oct 6th,2015 No Comments

1.测试环境

– 服务端:普通机*(I3 2核心4线程)/mem:16GB

– 客户端:普通机*(I3 2核心4线程)/mem:48GB(4台)

– 系统:sys:Centos  6  Erlang:OTP 18   Ejabberd 15

– 网络:内网千兆互联

分布式测试

distributed-test

 

2.Ejabberd 性能调优

调整ulimit限制

编辑/etc/security/limits.conf,加上:

# 方便看core
root hard core unlimited
root soft core unlimited

root hard fsize unlimited
root soft fsize unlimited

# socket连接数限制
root hard nofile 655350
root soft nofile 655350

编译优化

官方不建议开启Hipe,速度提升的同时可能带来一些问题,如fprof不能正常使用,这里面选择部分hipe(xml),参考Speed Up Ejabberd

cd ejabberd/deps/p1_xml/src
erlc +native xml.erl
cp xml.beam ejabberd ebin

启动参数调整(安装路径默认)

编辑/etc/ejabberd/ejabberdctl.cfg

  • ERL_MAX_PORTS (默认最大32w在线)

每个到客户端(s2c)和服务器(s2s)的连接消耗一个port, ERL_MAX_PORTS定义了Ejabberd可以支持的并发连接数,默认值为32000,大并发连接场景下的应用需要增大该参数的值。这里改成3200000。

ERL_MAX_PORTS=3200000
  • ERL_PROCESSES (默认最大12w在线)

Erlang消耗很多轻量级进程, 如果Ejabberd比较繁忙, 可能会达到进程数上限, 这种情况会导致高。 当消息延迟过高时, 需要判断是否是由于该参数引起的。默认值为250000,这里改成25000000。

ERL_PROCESSES=25000000
  • Mnesia表过载

大并发时mnesia警告** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},在disc_copy类型的表时,有两个参数影响出现Mnesia is overloaded: {dump_log, write_threshold}错误,默认参数是dump_log_write_threshold 50000 -mnesia dc_dump_limit 40。

dc_dump_limit:磁盘备份表从内存中被抛弃的时间间隔
dump_log_time_threshold:在新垃圾回收之前的最大的写入数

MNESIA_OPTIONS="-mnesia dump_log_write_threshold 50000 -mnesia dc_dump_limit 40"
  • ETS表个数限制问题

ets表使用的数目超过系统的限制提示:”Too many db tables”

ERL_MAX_ETS_TABLES=140000
  • 快速垃圾回收(影响不确定,不是很建议加)

按1k/sec 频率登录时,当在线到达10w时会触发gc(Major collection),在gc执行期间开销比较大(通过VTune),会引起中断,造成cpu跑满,系统响应下降。fullsweep_after控制深扫描的频率,这个参数确定多少次gc后执行一次深度gc,这里调成0,可以较快内存回收。

ERL_FULLSWEEP_AFTER=0
export ERL_FULLSWEEP_AFTER
  • Erlang 虚拟机参数(影响不确定,不是很建议加)

参考:http://www.cnblogs.com/lulu/p/4132278.html

修改/etc/ejabberd/ejabberdctl.cfg中的ERL_OPTIONS

ERL_OPTIONS="-sbt db -sbwt none -swt low"

+sbt db 绑定调度器与CPU的亲缘性
+sbwt none 关闭beam 调度器 spinlock,降低CPU
+swt low 提高调度器唤醒灵敏度,避免长时间运行睡死问题
+P 2000000 进程数限制(默认即可)
+K true 启用epoll (默认使用)
+smp auto 在多核上开启多个调度器 (默认使用)

 

ejabberd配制调整

  • 调整日志等级

修改/etc/ejabberd/ejabberd.yml

loglevel: 3
  • 堆大小监视调整

在线到达10w后cpu消耗大问题。

watchdog_large_heap: 10000000

 

内核参数调整

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_rmem = 4096 4096 16777216
net.ipv4.tcp_wmem = 4096 4096 16777216
net.ipv4.ip_local_port_range = 1025 65000
fs.file-max = 65535000
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.core.netdev_max_backlog = 30000
net.ipv4.tcp_mtu_probing = 1

3.压测场景

  •  2k/s 登陆、认证、操作。
  • 运行2分钟后20w在线

4.结果

  • 4台tsung集群未跑满,瓶颈在服务器。
  • 服务器:未触发gc时CPU剩余30%左右。
  • 服务器:内存最高7g,登陆完后稳定3g。
  • 服务器:流量上平均收2.5m/sec,发3.5m/sec。
  • 在gc(Major collection)启动时会比较严重影响服务器响应速度,在不开启快速回收(fullsweep_after)在线达不到要求(20w),下图可以明显看到。

ejabberd_gc

 

参考资料

1.Erlang C1500K长连接推送服务-性能

http://www.cnblogs.com/lulu/p/4132278.html

2.Erlang进程堆垃圾回收机制

http://blog.csdn.net/mycwq/article/details/26613275

3.Erlang垃圾回收机制

http://www.cnblogs.com/me-sa/archive/2011/11/13/erlang0014.html

4.erlang 虚机CPU 占用高排查

http://www.cnblogs.com/lulu/p/3978378.html

MCRouter笔记(三) 路由句柄

Aug 12th,2015 No Comments

来自:https://github.com/facebook/mcrouter/wiki/List-of-Route-Handles

 

AllAsyncRoute

立即发送请求到所有子路由句柄,不等待子路由句柄返回,直接返回NullRoute给请求方。

属性:

  • children: 子路由句柄。

AllFastestRoute

立即发送请求到所有子路由句柄,把第一个无错误的响应返回给请求,其它的返回默认忽略。

属性:

  • children: 子路由句柄。

AllInitialRoute

立即发送请求到所有子路由句柄,等待子路由句柄列表中第一个句柄的返回,并把这个给请求方,其它的返回默认忽略。

属性:

  • children: 子路由句柄。

AllMajorityRoute

Immediately sends the same request to all child route handles. Waits for replies until a non-error result appears (half + 1) times (or all replies if that never happens), and then returns the latest reply that it sees (the effect is that typically the reply with the most common result is returned).

  • children: 子路由句柄。

AllSyncRoute

立即发送请求到所有子路由句柄,返回所有回复中最差的。

属性:

  • children: 子路由句柄。

DevNullRoute

Same as NullRoute, but with mcrouter stats reporting. See Stats list.

ErrorRoute

Immediately returns the error reply for each request. You can specify the error value to return: "ErrorRoute|MyErrorValueHere"

FailoverRoute

首先发送请求到子路由句柄列表中的第一个路由句柄,如果没有返回错误就立即返回请求,否则继续发到列表中的下一个路由句柄。如果所有都返回错误则返回最后一个错误的回复。注意:没命中不算错误。

  • children: 子路由句柄。
  • failover_errors:对象或数组,可选项,默认所有错误。

failover_errors可指定错误类型,如:

{
 "gets": [ "connect_timeout", "timeout", "connect_error", "tko" ],
 "updates": [], // empty array: will not failover.
 // "deletes" is missing, default behavior (all errors) will be assumed.
}
[ "connect_timeout", "timeout", "connect_error", "tko" ]

FailoverWithExptimeRoute

 

HashRoute

根据哈希路由。

  • children: 子路由句柄。
  • salt:key的前缀。
  • hash_func:哈希函数Ch3, Crc32 or WeightedCh3,默认为Ch3。
  • weights:hash_func为WeightedCh3时有效。

HostIdRoute

根据客户端ID路由。

  • children: 子路由句柄。

LatestRoute

随机连接,如果返回错误再次随机,最大随机次数为failover_count。

  • children: 子路由句柄。
  • failover_count:默认5次
  • failover_errors:错误类型。

MCRouter笔记(二) 常见应用

Aug 7th,2015 No Comments
  • 分片池

当数据量太大,单个memcached不够放时,通常会把数据拆分到多台机器上,这就是所谓的水平分割。mcrouter提供了一个行之有效的consistent hashing算法(furc_hash),算法允许给多个memcached实例分配哈希值。Hostname hashing再根据分配的哈希值为客户端选择一个独一无二的副本,在特定的应用中有很多其他的有用的散列方法。

分片池

分片池

 

配制说明:请求按hash key路由到池A中不同的memcached。

{
   "pools": {
     "A": {
       "servers": [
         // your destination memcached boxes here, e.g.:
         "127.0.0.1:12345",
         "[::1]:12346"
       ]
     }
   },
   "route": "PoolRoute|A"
 }

 

Read More…

MCRouter笔记(一) – 安装

Aug 6th,2015 2 Comments
#!/bin/bash

temp_path=$(dirname "$0")
cd $temp_path
real_path=$(pwd)
echo  "本脚本文件所在目录路径是: $real_path "
cd $real_path

yum -y install unzip bzip2-devel libtool libevent-devel libcap-devel openssl-devel
yum -y install bison flex snappy-devel numactl-devel cyrus-sasl-devel

mkdir -p /data/source/mcrouter/src

#GCC4.9 folly用到了诸如 chrono 之类的C++11库,必须使用GCC 4.8以上版本,才能够完整支持这些用到的C++11特性和标准库。
cd /data/source/mcrouter/src
wget https://gmplib.org/download/gmp/gmp-5.1.3.tar.bz2
tar jxf gmp-5.1.3.tar.bz2 && cd gmp-5.1.3/
./configure && make && make install

cd /data/source/mcrouter/src
wget http://www.mpfr.org/mpfr-current/mpfr-3.1.2.tar.bz2
tar jxf mpfr-3.1.2.tar.bz2 ;cd mpfr-3.1.2/
./configure && make && make install

cd /data/source/mcrouter/src
wget http://www.multiprecision.org/mpc/download/mpc-1.0.1.tar.gz
tar xzf mpc-1.0.1.tar.gz ;cd mpc-1.0.1
./configure && make && make install

cd /data/source/mcrouter/src
wget http://ftp.gnu.org/gnu/gcc/gcc-4.9.1/gcc-4.9.1.tar.bz2
tar jxf gcc-4.9.1.tar.bz2 ;cd gcc-4.9.1
ldconfig
./configure -enable-threads=posix -disable-checking -disable-multilib -enable-languages=c,c++ -with-gmp -with-mpfr -with-mpc
make && make install
ldconfig


#CMAKE
cd /data/source/mcrouter/src
wget http://www.cmake.org/files/v2.8/cmake-2.8.12.2.tar.gz
tar xvf cmake-2.8.12.2.tar.gz && cd cmake-2.8.12.2
./configure && make && make install


#AutoConf
cd /data/source/mcrouter/src
wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz
tar xvf autoconf-2.69.tar.gz && cd autoconf-2.69
./configure && make && make install


#SCONS
cd /data/source/mcrouter/src
rpm -Uvh http://sourceforge.net/projects/scons/files/scons/2.3.3/scons-2.3.3-1.noarch.rpm


#Ragel
cd /data/source/mcrouter/src
wget http://www.colm.net/files/ragel/ragel-6.9.tar.gz
tar -zxvf ragel-6.9.tar.gz
cd ragel-6.9
./configure && make && make install


#Python27 for Boost
yum -y install centos-release-SCL
yum -y install python27
scl enable python27 "easy_install pip"


#Boost
scl enable python27 bash
python --version
cd /data/source/mcrouter/src
wget http://downloads.sourceforge.net/boost/boost_1_56_0.tar.bz2
tar jxf boost_1_56_0.tar.bz2 && cd boost_1_56_0
./bootstrap.sh --prefix=/usr && ./b2 stage threading=multi link=shared
./b2 install threading=multi link=shared
ldconfig


#Gflags
cd /data/source/mcrouter/src
wget https://github.com/schuhschuh/gflags/archive/v2.1.1.tar.gz
tar xzvf gflags-v2.1.1.tar.gz
mkdir -p gflags-2.1.1/build/ && cd gflags-2.1.1/build/
cmake .. -DBUILD_SHARED_LIBS:BOOL=ON -DGFLAGS_NAMESPACE:STRING=google && make && make install


#GLOG
cd /data/source/mcrouter/src
wget https://google-glog.googlecode.com/files/glog-0.3.3.tar.gz
tar xvf glog-0.3.3.tar.gz && cd glog-0.3.3
./configure && make && make install


#double-conversion for Folly
cd /data/source/mcrouter/src
git clone https://code.google.com/p/double-conversion/
cd double-conversion-master && scons install
ln -sf src double-conversion
ldconfig


#Folly
cd /data/source/mcrouter/src
git clone https://github.com/genx7up/folly.git
cd folly/folly/test
wget https://googletest.googlecode.com/files/gtest-1.6.0.zip
unzip gtest-1.6.0.zip
cd ../
autoreconf --install
export CPPFLAGS="-I/data/source/mcrouter/double-conversion"
./configure && make && make install


#McRouter
cd /data/source/mcrouter/src
git clone https://github.com/facebook/mcrouter.git
cd mcrouter/mcrouter
export CPPFLAGS="-I/data/source/mcrouter/double-conversion"
autoreconf --install
./configure && make && make install
mcrouter --help

 

PHP 二进制小端转大端

May 13th,2012 2 Comments
	function LbinToGbin($binarydata) {
		$hex = bin2hex($binarydata);

		$strlen = strlen($hex);
		$hex_arr = array();
		$j = 0;
		for($i=0; $i<$strlen; $i++){
			if($i%2 == 0){
				$hex_array[$j] = $hex[$i];
			}else{
				$hex_array[$j] .= $hex[$i];
				$j++;
			}
		}
		$hex_array = array_reverse($hex_array);
		foreach($hex_array as $v){
			$newhex .= $v;
		}

		$bin = "";
		$i = 0;
		do {
			$bin .= chr(hexdec($newhex{$i}.$newhex{($i + 1)}));
			$i += 2;
		} while ($i < strlen($newhex));
		return $bin;
	}

linux批量替换文件内容3种方法(perl,sed,shell)

Apr 12th,2012 No Comments

ctags: linux perl shell perl vi grep awk xargs 批量替换

方法1:

这两天在构建一个应用的使用用到了maven,由于project很大,足足有700多个 pom.xml文件,更郁闷的是在很多pom.xml文件里都单独指定了资源库的url,我需要把这些资源库的url统一指定到nexus本地中央库.
手 工一个个改文件配置有点不太实际,所以google了一下,找到批量替换文件内容的好方法,命令结构如下:
find -name ‘要查找的文件名’ | xargs perl -pi -e ‘s|被替换的字符串|替换后的字符串|g’下面这个例子就是将当前目录及所有子目录下的所有pom.xml文件中的”http://repo1.maven.org/maven2“ 替换为”http://localhost:8081/nexus/content/groups/public“.
find -name ‘pom.xml’ | xargs perl -pi -e ‘s|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content /groups/public|g’这里用到了Perl语言,
perl -pi -e 在Perl 命令中加上-e 选项,后跟一行代码,那它就会像运行一个普通的Perl 脚本那样运行该代码.
从命令行中使用Perl 能够帮助实现一些强大的、实时的转换。认真研究正则表达式,并正确地使用,将会为您省去大量的手工编辑工作。
find -name ‘pom.xml’ | xargs perl -pi -e ‘s|http://repo1.maven.org/maven2|http://localhost:8081/nexus/content/groups/public|g’
Read More…

goagent笔记

Mar 14th,2012 No Comments

1.注册google账号。

2.到这里开通Google App Engine:http://appengine.google.com

3.goagent http://code.google.com/p/goagent/

4.chrome用SwitchySharp firefox用Autoproxy

Read More…

《一江春水向东流》

Dec 26th,2011 1 Comment

任正非在圣诞节发表
全文如下:

一江春水向东流 任正非 2011年12月25日

千古兴亡多少事,一江春水向东流。

小时候,妈妈给我们讲希腊大力神的故事,我们崇拜得不得了。少年不知事的时期我们崇拜上李元霸、宇文成都这种盖世英雄,传播着张飞“杀”(争斗)岳飞的荒诞故事。在青春萌动的时期,突然敏感到李清照的千古情人是力拔山兮的项羽。至此“生当作人杰,死亦为鬼雄”又成了我们的人生警句。当然这种个人英雄主义,也不是没有意义,它迫使我们在学习上争斗,成就了较好的成绩。

当我走向社会,多少年后才知道,我碰到头破血流的,就是这种不知事的人生哲学。我大学没入了团,当兵多年没入了党,处处都处在人生逆境,个人很孤立,当我明白团结就是力量这句话的政治内涵时,已过了不惑之年。想起蹉跎了的岁月,才觉得,怎么会这么幼稚可笑,一点都不明白开放、妥协、灰度呢?

我是在生活所迫,人生路窄的时候,创立华为的。那时我已领悟到个人才是历史长河中最渺小的,这个人生真谛。我看过云南的盘山道,那么艰险,一百多年前是怎么确定路线,怎么修筑的,为筑路人的智慧与辛苦佩服;我看过薄薄的丝绸衣服,以及为上面栩栩如生的花纹是怎么织出来的,而折服,织女们怎么这么巧夺天工?天啊!不仅万里长城、河边的纤夫、奔驰的高铁……我深刻地体会到,组织的力量、众人的力量,才是力大无穷的。人感知自己的渺小,行为才开始伟大。在创立华为时,我已过了不惑之年。不惑是什么意思,是几千年的封建社会,环境变动缓慢,等待人的心理成熟的一个尺度。而我进入不惑之年时,人类已进入电脑时代,世界开始疯起来了,等不得我的不惑了。

我突然发觉自己本来是优秀的中国青年,所谓的专家,竟然越来越无知。不是不惑,而是要重新起步新的学习,时代已经没时间与机会,让我不惑了,前程充满了不确定性。我刚来深圳还准备从事技术工作,或者搞点科研的,如果我选择这条路,早已被时代抛在垃圾堆里了。我后来明白,一个人不管如何努力,永远也赶不上时代的步伐,更何况知识爆炸的时代。只有组织起数十人、数百人、数千人一同奋斗,你站在这上面,才摸得到时代的脚。我转而去创建华为时,不再是自己去做专家,而是做组织者。在时代前面,我越来越不懂技术、越来越不懂财务、半懂不懂管理,如果不能民主的善待团体,充分发挥各路英雄的作用,我将一事无成。从事组织建设成了我后来的追求,如何组织起千军万马,这对我来说是天大的难题。我创建了华为公司,当时在中国叫个体户,这么一个弱小的个体户,想组织起千军万马,是有些狂妄,不合时宜,是有些想吃天鹅肉的梦幻。

我创建公司时设计了员工持股制度,通过利益分享,团结起员工,那时我还不懂期权制度,更不知道西方在这方面很发达,有多种形式的激励机制。仅凭自己过去的人生挫折,感悟到与员工分担责任,分享利益。创立之初我与我父亲相商过这种做法,结果得到他的大力支持,他在卅年代学过经济学。这种无意中插的花,竟然今天开放到如此鲜艳,成就华为的大事业。

在华为成立之初,我是听任各地“游击队长”们自由发挥的。其实,我也领导不了他们。前十年几乎没有开过办公会类似的会议,总是飞到各地去,听取他们的汇报,他们说怎么办就怎么办,理解他们,支持他们;听听研发人员的发散思维,乱成一团的所谓研发,当时简直不可能有清晰的方向,像玻璃窗上的苍蝇,乱碰乱撞,听客户一点点改进的要求,就奋力去找机会……。更谈不上如何去管财务的了,我根本就不懂财务,这与我后来没有处理好与财务的关系,他们被提拔少,责任在我。也许是我无能、傻、才如此放权,使各路诸侯的聪明才智大发挥,成就了华为。我那时被称作甩手掌柜,不是我甩手,而是我真不知道如何管。今天的接班人们,个个都是人中精英,他们还会不会像我那么愚钝,继续放权,发挥全体的积极性,继往开来,承前启后呢?他们担任的事业更大,责任更重,会不会被事务压昏了,没时间听下面唠叨了呢……。相信华为的惯性,相信接班人们的智慧。

到97年后,公司内部的思想混乱,主义林立,各路诸侯都显示出他们的实力,公司往何处去,不得要领。我请人民大学的教授们,一起讨论一个“基本法”,用于集合一下大家发散的思维,几上几下的讨论,不知不觉中“春秋战国”就无声无息了,人大的教授厉害,怎么就统一了大家的认识了呢?从此,开始形成了所谓的华为企业文化,说这个文化有多好,多厉害,不是我创造的,而是全体员工悟出来的。我那时最多是从一个甩手掌柜,变成了一个文化教员。业界老说我神秘、伟大,其实我知道自己,名实不符。我不是为了抬高自己,而隐起来,而是因害怕而低调的。真正聪明的是十三万员工,以及客户的宽容与牵引,我只不过用利益分享的方式,将他们的才智粘合起来。

公司在意志适当集中以后,就必须产生必要的制度来支撑这个文化,这时,我这个假掌柜就躲不了了,从上世纪末,到本世纪初,大约在2003年前的几年时间,我累坏了,身体就是那时累垮的。身体有多项疾病,动过两次癌症手术,但我乐观……。那时,要出来多少文件才能指导,约束公司的运行,那时公司已有几万员工,而且每天还在不断大量地涌入。你可以想象混乱到什么样子。我理解了,社会上那些承受不了的高管,为什么选择自杀。问题集中到你这一点,你不拿主意就无法运行,把你聚焦在太阳下烤,你才知道CEO不好当。每天十多个小时以上的工作,仍然是一头雾水,衣服皱巴巴的,内外矛盾交集。我人生中并没有合适的管理经历,从学校,到军队,都没有做过有行政权力的“官”,不可能有产生出有效文件的素质,左了改,右了又改过来,反复烙饼,把多少优秀人才烙糊了,烙跑了……。这段时间的摸着石头过河,险些被水淹死。

2002年,公司差点崩溃了。IT泡沫的破灭,公司内外矛盾的交集,我却无能为力控制这个公司,有半年时间都是噩梦,梦醒时常常哭。真的,不是公司的骨干们,在茫茫黑暗中,点燃自己的心,来照亮前进的路程,现在公司早已没有了。这段时间孙董事长团结员工,增强信心,功不可没。

大约2004年,美国顾问公司帮助我们设计公司组织结构时,认为我们还没有中枢机构,不可思议。而且高层只是空任命,也不运作,提出来要建立EMT(Executive Management Team),我不愿做EMT的主席,就开始了轮值主席制度,由八位领导轮流执政,每人半年,经过两个循环,演变到今年的轮值CEO制度。也许是这种无意中的轮值制度,平衡了公司各方面的矛盾,使公司得以均衡成长。轮值的好处是,每个轮值者,在一段时间里,担负了公司COO的职责,不仅要处理日常事务,而且要为高层会议准备起草文件,大大地锻炼了他们。同时,他不得不削小他的屁股,否则就达不到别人对他决议的拥护。这样他就将他管辖的部门,带入了全局利益的平衡,公司的山头无意中在这几年削平了。

经历了八年轮值后,在新董事会选举中,他们多数被选上。我们又开始了在董事会领导下的轮值CEO制度,他们在轮值期间是公司的最高的行政首长。他们更多的是着眼公司的战略,着眼制度建设。将日常经营决策的权力进一步下放给各BG、区域,以推动扩张的合理进行。这比将公司的成功系于一人,败也是这一人的制度要好。每个轮值CEO在轮值期间奋力地拉车,牵引公司前进。他走偏了,下一轮的轮值CEO会及时去纠正航向,使大船能早一些拨正船头。避免问题累积过重不得解决。

我不知道我们的路能走多好,这需要全体员工的拥护,以及客户和合作伙伴的理解与支持。我相信由于我的不聪明,引出来的集体奋斗与集体智慧,若能为公司的强大、为祖国、为世界作出一点贡献,廿多年的辛苦就值得了。我知识的底蕴不够,也并不够聪明,但我容得了优秀的员工与我一起工作,与他们在一起,我也被熏陶得优秀了。他们出类拔萃,夹着我前进,我又没有什么退路,不得不被“绑”着,“架”着往前走,不小心就让他们抬到了峨眉山顶。我也体会到团结合作的力量。这些年来进步最大的是我,从一个“土民”,被精英们抬成了一个体面的小老头。因为我的性格像海绵一样,善于吸取他们的营养,总结他们的精华,而且大胆地开放输出。那些人中精英,在时代的大潮中,更会被众人团结合作抬到喜马拉雅山顶。希腊大力神的母亲是大地,他只要一靠在大地上就力大无穷。我们的大地就是众人和制度,相信制度的力量,会使他们团结合作把公司抬到金顶的。

作为轮值CEO,他们不再是只关注内部的建设与运作,同时,也要放眼外部,放眼世界,要自己适应外部环境的运作,趋利避害。我们伸出头去,看见我们现在是处在一个多变的世界,风暴与骄阳,和煦的春光与万丈深渊……并存着。我们无法准确预测未来,仍要大胆拥抱未来。面对潮起潮落,即使公司大幅度萎缩,我们不仅要淡定,也要矢志不移地继续推动组织朝向长期价值贡献的方向去改革。要改革,更要开放。要去除成功的惰性与思维的惯性对队伍的影响,也不能躺在过去荣耀的延长线上,只要我们能不断地激活队伍,我们就有希望。历史的灾难经常是周而复始的,人们的贪婪,从未因灾难改进过,过高的杠杆比,推动经济的泡沫化,总会破灭。

我们唯有把握更清晰的方向,更努力地工作,任何投机总会要还账的。经济越来越不可控,如果金融危机的进一步延伸爆炸,货币急剧贬值,外部社会动荡,我们会独善其身吗?我们有能力挽救自己吗?我们行驶的航船,员工会像韩国人卖掉金首饰救国家一样,给我们集资买油吗?历史没有终结,繁荣会永恒吗?我们既要有信心,也不要盲目相信未来,历史的灾难,都是我们的前车之鉴。我们对未来的无知是无法解决的问题,但我们可以通过归纳找到方向,并使自己处在合理组织结构及优良的进取状态,以此来预防未来。死亡是会到来的,这是历史规律,我们的责任是应不断延长我们的生命。

千古兴亡多少事,一江春水向东流,流过太平洋,流过印度洋,……不回头。