Archive for October, 2014

作者:AngryFox 分类: Uncategorized October 29th, 2014 暂无评论

函数原型
bool flock (resource fp, int operation [, int & wouldblock])
要取得共享锁定(读取的程序),将 lock 设为 LOCK_SH(PHP 4.0.1 以前的版本设置为 1)。
要取得独占锁定(写入的程序),将 lock 设为 LOCK_EX(PHP 4.0.1 以前的版本中设置为 2)。
要释放锁定(无论共享或独占),将 lock 设为 LOCK_UN(PHP 4.0.1 以前的版本中设置为 3)。
如果不希望 flock() 在锁定时堵塞,则给 lock 加上 LOCK_NB(PHP 4.0.1 以前的版本中设置为 4)。
为了确保操作的有效性和完整性,可以通过锁机制将并发状态转换成穿行状态。
 什么时候用LOCK_EX,什么时候用LOCK_SH呢?
  读的时候:如果不想出现dirty数据,那么最好使用LOCK_SH共享锁。可以考虑以下三种情况:
  1.如果读的时候没有加共享锁,那么其它程序要写的话都会立即些成功。如果正好读了一半,然后被其它程序给写了,那么读的后一半就有可能跟前一半对不上(前一半是修改前的,后一半是修改后的);
  2.如果读的时候加上了共享锁(因为只是读,没必要使用排他锁即独占锁),这个时候,其它程序开始写,这个写程序没有使用锁,那么写程序会直接修改这个文件,也会导致前面一样的问题;
  3.最理想的情况是,读的时候加共享锁LOCK_SH,写的时候也进行加独占锁LOCK_EX,这样写程序会等着读程序完成之后才进行操作,而不会出现贸然操作的情况。
  写的时候:如果多个写程序不加锁,同时对文件进行操作,那么最后的数据有可能一部分是a程序写的,一部分是b程序写的。

<?php

function writeMessage($filename, $message) {
        $fp = fopen($filename, "a");
        if(flock($fp, LOCK_EX)) {
                fwrite($fp, $message);
                flock($fp, LOCK_UN);
        }else{
                echo "cannot lock file";
        }
}

function readMessage($filename) {
        $fp = fopen($filename, "r");
        flock($fp, LOCK_UN);
        $buffer = '';

        while(!feof($fp)) {
                $buffer .= fread($fp, 1024);
        }
        flock($fp, LOCK_UN);
        fclose($fp);
}

//如果不希望出现锁定堵塞发生,可以附加LOCK_NB
$file = fopen("test.txt", "w+"); //以读写的方式打开文件
flock($file, LOCK_EX+LOCK_NB);//独占锁定加上附加锁定

fwrite($file, "hello xxx"); // 向文件中写放数据
flock($file, LOCK_UN+LOCK_NB); //释放锁定也加上了附加锁定

fclose($file);

writeMessage("fuck.txt", "\n May I fuck you? \n");
readMessage("fuck.txt");

为了降低风险程度和提高程序运行效率,业界提出了不采用锁的同步方案,依照这种设计思路设计的算法称为非阻塞型算法,其本质特征就是停止一个线程的执行不会阻碍系统中其他执行实体的运行。
当今比较流行的 Non-blocking Synchronization 实现方案有三种:
Wait-free
Wait-free 是指任意线程的任何操作都可以在有限步之内结束,而不用关心其它线程的执行速度。 Wait-free 是基于 per-thread 的,可以认为是 starvation-free 的。非常遗憾的是实际情况并非如此,采用 Wait-free 的程序并不能保证 starvation-free,同时内存消耗也随线程数量而线性增长。目前只有极少数的非阻塞算法实现了这一点。
Lock-free
Lock-Free 是指能够确保执行它的所有线程中至少有一个能够继续往下执行。由于每个线程不是 starvation-free 的,即有些线程可能会被任意地延迟,然而在每一步都至少有一个线程能够往下执行,因此系统作为一个整体是在持续执行的,可以认为是 system-wide 的。所有 Wait-free 的算法都是 Lock-Free 的。
Obstruction-free
Obstruction-free 是指在任何时间点,一个孤立运行线程的每一个操作可以在有限步之内结束。只要没有竞争,线程就可以持续运行。一旦共享数据被修改,Obstruction-free 要求中止已经完成的部分操作,并进行回滚。 所有 Lock-Free 的算法都是 Obstruction-free 的。
综上所述,不难得出 Obstruction-free 是 Non-blocking synchronization 中性能最差的,而 Wait-free 性能是最好的,但实现难度也是最大的,因此 Lock-free 算法开始被重视,并广泛运用于当今正在运行的程序中,比如 linux 内核。

http://blog.csdn.net/zzulp/article/details/6259866

作者:AngryFox 分类: Uncategorized October 28th, 2014 暂无评论

1.环境准备
1).说明
192.168.1.104 python api机器
192.168.1.105 docker容器
2)docker环境部署

http://blog.angryfox.com/?p=2701

3.开通socket通信
修改自启动服务文件,支持远程TCP接口与本地SOCK连接;

# vi /etc/init.d/docker
$exec -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -d &>> $logfile &
#service docker restart

2.创建镜像
1、获取最新的centos镜像
# docker pull centos:latest
2、编写Dockerfile(支持apache+ssh服务)
# mkdir /home/Dockerfile/webserver
# cd /home/Dockerfile/webserver
# vi Dockerfile

# This is a base comment
FROM centos:latest
MAINTAINER 

#yum install Package
RUN yum -y install net-tools
RUN yum -y install iputils  iproute  man  vim-minimal  openssh-server  openssh-clients
RUN yum -y install httpd
RUN yum -y install python-setuptools
RUN easy_install supervisor  

#set sshd
RUN ssh-keygen -q -N "" -t dsa -f /etc/ssh/ssh_host_dsa_key
RUN ssh-keygen -q -N "" -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -N ""
RUN sed -ri 's/session    required     pam_loginuid.so/#session    required     pam_loginuid.so/g' /etc/pam.d/sshd
RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh
RUN echo 'root:Ksjhg34TDju' | chpasswd  

#set supervisor
RUN mkdir -p /var/log/supervisor
ADD supervisord.conf /etc/supervisord.conf  

#set port
EXPOSE 22
EXPOSE 80  

#set ENV
ENV LANG en_US.UTF-8
ENV LC_ALL en_US.UTF-8  

#run supervisor
CMD ["/usr/bin/supervisord -c /etc/supervisord.conf"]

通过supervisord来维护Docker容器中服务进程,编写supervisord.conf

# vi supervisord.conf
view plainprint?
[supervisord]
nodaemon=true  

[program:sshd]
command=/usr/sbin/sshd -D  

[program:httpd]
command=/usr/sbin/httpd -DFOREGROUND  

创建镜像,运行:
# docker build -t yorko/webserver:v1 . 注:最后有一个“.”,别遗漏。

镜像生成完毕后运行docker images查看

3.编写操作API
登陆 192.168.1.104
# mkdir /home/test/docker-py
# cd /home/test/docker-py
1)、安装docker-py
# wget https://github.com/docker/docker-py/archive/master.zip
# unzip master
# cd docker-py-master/
# python setup.py install
如正常导入模块(import docker)说明安装成功。

2)、创建容器docker_create.py

import docker  

c = docker.Client(base_url='tcp://192.168.1.105:2375',version='1.13',timeout=10)
c.create_container(image="yorko/webserver:v1",stdin_open=True,tty=True,command="/usr/bin/supervisord -c /etc/supervisord.conf",volumes=['/data'],ports=[80,22],name="webserver12")
#print str(r)
print 'Hello'

3)运行容器docker_start.py

import docker  

c = docker.Client(base_url='tcp://192.168.1.105:2375',version='1.13',timeout=10)
r=c.start(container='webserver12', binds={'/data':{'bind': '/data','ro': False}}, port_bindings={80:80,22:2022}, lxc_conf=None,
        publish_all_ports=True, links=None, privileged=False,
        dns=None, dns_search=None, volumes_from=None, network_mode=None,
        restart_policy=None, cap_add=None, cap_drop=None)
#print str(r)
print 'start'

4)、运行
# python docker_create.py
# python docker_start.py
更多API参考https://github.com/docker/docker-py

5)、在Docker主机观察结果 docker ps -l

3.检查
1)校验SSH服务
ssh root@192.168.1.105 -p 2022
2) 校验WEB服务
浏览器访问: 192.168.1.105
3)检查数据卷
df

参考:

http://geoffrey.io/a-php-development-environment-with-docker.html

http://blog.liuts.com/post/241/

作者:AngryFox 分类: Uncategorized October 26th, 2014 暂无评论

在visualbox里装的centos6.5_x64,按照文档操作下来,比较顺畅
Docker官网 http://www.docker.com/

https://docs.docker.com/installation/centos/

一,安装EPEL
关于EPEL:https://fedoraproject.org/wiki/EPEL/zh-cn
>rpm -ivh http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
>rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6
>yum -y install yum update

二,安装Docker
>yum -y install docker-io
>service docker start
>chkconfig docker on

三,应用Docker
1,获取Centos镜像
>docker pull centos:latest
2,查看镜像运行情况
>docker images centos
3,在容器下运行 shell bash
>docker run -i -t centos /bin/bash
4,停止容器
>docker stop
5,查看容器日志
>docker logs -f
6,删除所有容器
>docker rm $(docker ps -a -q)
7,删除镜像
>docker rmi
8,提交容器更改到镜像仓库中
>docker run -i -t centos /bin/bash
>useradd myuser
>exit
>docker ps -a |more
>docker commit myuser/centos
9,创建并运行容器中的 hello.sh
>docker run -i -t myuser/centos /bin/bash
>touch /home/myuser/hello.sh
>echo “echo \”Hello,World!\”" > /home/myuser/hello.sh
>chmod +x /home/myuser/hello.sh //开另外的shell操作
>exit
>docker commit myuser/centos
>docker run -i -t myuser/centos /bin/sh /home/myuser/hello.sh
10,在容器中运行Nginx
在容器中安装Nginx,在nginx.conf头部添加:
daemon off;
保存,退出容器提交到镜像中。
启动Docker中的Nginx
>docker run -d -p 81:80 nginx/centos /data/apps/nginx/sbin/nginx
在浏览器访问宿主机81端口。
11,映射容器端口
>docker run -d -p 192.168.9.11:2201:22 nginx/centos /usr/sbin/sshd -D
用ssh root@192.168.9.11 -p 2201 连接容器,提示:
Connection to 192.168.1.205 closed.(此问题还未解决!!!)

可能会遇到的问题:
##在容器里面修改用户密码的时候报错:
/usr/share/cracklib/pw_dict.pwd: No such file or directory
PWOpen: No such file or directory
解决:
yum -y reinstall cracklib-dicts

作者:AngryFox 分类: Uncategorized October 23rd, 2014 暂无评论

安装第一步:JAVA SDK(JDK)的安装:

可以去问百度下载JDK,也可以到官方下载JDK。
官方下载地址: http://www.oracle.com/technetwork/java/javase/downloads/index.html

装完之后就可以配置环境变量:
右击我的电脑->属性->高级->环境变量,配置3个环境变量;Path,JAVA_HOME,CLASSPATH,
Path:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
CLASSPATH:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar; 前面有个点
运行里出入cmd,敲java跟java –version跟javac –version

问题:fail to load the jni shared library jvm.dll
需要安装64位的jdk
配置adb的Path路径
第二步: 下载ADT-Bundle for Windows
官方下载地址:http://developer.android.com/sdk/index.html
第三步:安装ADT-Bundle
直接把下载下来的的adt-bundle-windows-xxx-xxx.zip,解压到你需要安装的位置。
第四步:安装Android SDK

打开解压出来的文件夹里面的 SDK Manager.exe (也可以运行eclipse/eclipse.exe 然后通过Windows -> Android SDK Manager打开)

作者:AngryFox 分类: Uncategorized October 23rd, 2014 暂无评论

压力测试方案
Redis提供Redis_benchmark,工具和Redis_cli辅助测试,以及monitor安装
1)各层故障对数据读写影响的情况,写入失败或者延迟多少?健康情况测试,任何一台twemproxy停止情况,LB的HA情况,切换平顺
2)两层代理的性能损坏情况,分别remove掉任何一层代理,性能会影响多少?
3)twemproxy后面增减redis server,对twemproxy的极限吞吐是否有影响?增加redis server会增加twemproxy的吞吐吗?
4)不断发出错误指令,是否会导致twemproxy崩溃性挂起?
5)测试redis server在twemproxy的ketama算法的,分布是否均衡。
6)测试redis server disable持久化(AOF,snaptshot),对redis的性能影响
7) 测试总体方案,在各个数据结构,和value大小不同情况下的,QPS和TPS。
库存拆库后solr这边主要出现如下几个问题:
问题1:solr不太稳定,容易出现solr节点Down掉;
问题2:在大并发情况下查询性能不理想。
问题1:
solr不太稳定,容易出现solr节点DOWN掉。
为了解决这个问题我们做了大量工作,主要如下几方面:
1、调整了更新频繁,从两方面进行优化
a. 从配置方式:
调整了solrconfig.xml里的提交频率、合并段的大小等。
b. 从后台代码方式:
修改了每次提交的文档数和提交方式。
2、后台监控solr节点状态
编写脚本监听solr节点状态,当solr的某个节点Down掉,会立即自动重启,使某个节点恢复正常。
经过这次调整后solrcloud已稳定下来,运行2个多月到目前为止还没有发现节点DOWN掉过。除非机房断电,否则绝不会存在单点故障问题。
问题2:
在大并发情况下查询性能不理想
我们从几方面进行了调优,分别如下:
a.从配置方式:
I、调整solrconfig.xml里一系列缓存的调整,如fitercache,queryResultCache,documentCache,fieldCache,perSegFilter等缓存。
II、调整字段类型。说明下:solr里面字段类型不同,查询性能有所差别。
b.从代码方式:
I、数据格式转换:使用更快的算法进行转换,在此采用了FastJson工具包。
II、采用过滤器的方式组装查询条件
C、API加入redis缓存
通过配置的方式把那些数据放进行缓存,业务调用方会从先缓存中获取数据,如果获取到直接返回。否则到solr里查询,然后把结果返回。
D、数据监控系统
开发了一个数据监控系统,这个监控系统可以定制那些数据进行监控,监控到有问题的数据会自动更新到搜索引擎里去。保证数据与数据库数据无差异。

作者:AngryFox 分类: Uncategorized October 13th, 2014 暂无评论

PHP依赖常见的OPENSSL LIB 。 JS依赖 jsencrypt
Web-Scale IT有5个典型特征:

拥有成千上万台机器的计算能力
只需少数工程师就可以运维大量机器
应用可以承载非常高的用户访问量
即使有些机器出现故障,应用仍然工作正常
应用每天可以升级部署应用好几次

采用session复制方式也多于基于Redis/Memcached的集中式session方案

并发用户数:是指现实系统中操作业务的用户,在性能测试工具中,一般称为虚拟用户数(Virutal User)。并发用户数和注册用户数、在线用户数的概念不同,并发用户数一定会对服务器产生压力的,而在线用户数只是 ”挂” 在系统上,对服务器不产生压力,注册用户数一般指的是数据库中存在的用户数。

TPS:Transaction Per Second, 每秒事务数, 是衡量系统性能的一个非常重要的指标。

SOA ≈ 模块化开发 + 分布式计算
1.优化远程调用
多路复用的TCP长连接
twitter的Mux RPC协议以及google的SPDY协议,在其中多个请求同时共用同一个长连接,即一个连接交替传输不同请求的字节块。它既避免了反复建立连接开销,也避免了连接的等待闲置从而减少了系统连接总数,同时还避免了TCP顺序传输中的线头阻塞(head-of-line blocking)问题。
2.消除冗余数据
3.粗粒度契约
同样由于远程调用开销高,同时service的外部使用者对特定业务流程的了解也比不上组织内部的人,所以service的契约(接口)通常需要是粗粒度的,其中的一个操作就可能对应到一个完整的业务用例或者业务流程,这样既能减少远程调用次数,同时又降低学习成本和耦合度。
4.通用契约
由于service不假设用户的范围,所以一般要支持不同语言和平台的客户端。但各种语言和平台在功能丰富性上有很大差异,这就决定了服务契约必须取常见语言、平台以及序列化方式的最大公约数,才能保证service广泛兼容性。由此,服务契约中不能有某些语言才具备的高级特性,参数和返回值也必须是被广泛支持的较简单的数据类型(比如不能有对象循环引用)。

5.隔离变化
契约先行
稳定和兼容的契约
契约包装
第一个层次是service架构:开发各种独立的service并满足前面的一些设计原则
第二个层次是service composition(组合)架构:独立的service通过不同组合来构成新的业务或者新的service。在理想情况下,可以用一种类似小孩搭积木的方式,充分发挥想象力,将独立的积木(service)灵活的拼装组合成新的形态,还能够自由的替换其中的某个构件。这体现出SOA高度便捷的重用性,大大提高企业的业务敏捷度。
第三个层次是service inventory(清单)架构:通过标准化企业服务清单(或者叫注册中心)统一的组织和规划service的复用和组合。
第四个层次是service-oriented enterprise架构

作者:AngryFox 分类: Uncategorized October 11th, 2014 暂无评论

一、 TCPDUMP使用示例:
监视指定网络接口的数据包
tcpdump -i eth1
如果不指定网卡,默认tcpdump只会监视第一个网络接口,一般是eth0,下面的例子都没有指定网络接

监视指定主机的数据包
tcpdump host 192.168.201.89
截获所有192.168.201.89 的主机收到的和发出的所有的数据包
tcpdump host 192.168.201.89 and \ (192.168.201.87 or 192.168.201.88\)
截获主机192.168.201.89 和主机192.168.201.87 或192.168.201.88的通信

二、使用wireshark进行数据分析
Tcpdump在默认情况下对数据包只抓取68个字节,而我们在测试过程中一般是对发送的xml进行抓取,此长度往往不够,
因此需要加上 -s 0参数,取消对长度的限制,同时为了能够让wireshark对数据包进行分析,需要-w保存为文件
将保存的文件获取到本地后,使用wireshark打开后

R1区域用来显示简单的数据包信息,我们用tcpdump抓包的时候,默认情况下也是显示成这样的。
R2区域用来显示选中的数据包的详细信息,他是按照TCP/IP四层结构显示的,第一行是数据链路层的信息, 第二行是网络层信息(IP协议),第三行是传输 层信息(TCP协议), 第四行是应用层信息(HTTP协议), 可以展开每一行用来观察具体的内容
R3区域是用来显示此数据包的真实面目。我们在R1和R2区域看到的信息都是Wireshark整理以后给我们看的,抓包的真实数据实际上是一堆二进制序列

使用如下方法可以查看到具体的报文内容,
Follow -> Follow TCP Stream