存档

2012年2月 的存档

Daniel-Journey Weekly Dose -2012/2/26

2012年2月23日 admin 3 条评论

Algorithm

Algorithm of the Week: Insertion Sort

LINUX

Linux系统内存相关信息获取

/proc/meminfo 每个字段的意思

ulimit

ulimit用于shell启动进程所占用的资源

cat /proc/<tomcat pid>/limits

How do I Find Out Linux CPU Utilization?

sar -u 2 5

Report CPU utilization. The following values are displayed:

  • %user: Percentage of CPU utilization that occurred while executing at the user level (application).
  • %nice: Percentage of CPU utilization that occurred while executing at the user level with nice priority.
  • %system: Percentage of CPU utilization that occurred while executing at the system level (kernel).
  • %iowait: Percentage of time that the CPU or CPUs were idle during which the system had an outstanding disk I/O request.
  • %idle: Percentage of time that the CPU or CPUs were idle and the system did not have an outstanding disk I/O request.

Programming

QPS

QPS每秒查询率(Query Per Second)

每秒查询率QPS是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准,在因特网上,作为域名系统服务器的机器的性能经常用每秒查询率来衡量。

对应fetches/sec,即每秒的响应请求数,也即是最大吞吐能力。

Context Switches

You can determine whether context switching is excessive by comparing it with the value of Processor\% Privileged Time. If this counter is at 40 percent or more and the context-switching rate is high, then you can investigate the cause for high rates of context switches.

线程

轻量级锁
偏向锁

多线程的优劣/性能/系统开销

1.进入内核模式;
2.将CPU的寄存器保存到当前正在执行的线程的内核对象中。
注明:X86架构下CPU寄存器占了大约700字节(Byte)的空间,X64架构下CPU寄存器大约占了1024(Byte)的空间,IA64架构下CPU寄存器占了大约2500Byte的空间。
3.需要一个自旋锁(spin lock),确定下一次调度那一个线程,然后再释放该自旋锁。
如果下一次调度的线程属于同一个进程,哪么此处开销更大,因为OS必须先切换虚拟地址空间。
4.把即将要运行的线程的内核对象的地址加载到CPU寄存器中。
5.退出内核模式。

There are three principles of package cohesion

There are three principles of package coupling

Java

理解HotSpot的CMS GC

Java Anti-Patterns

Jboss调优——最佳线程数

一个GC频繁的Case

Java轻量级锁原理详解(Lcightweight Locking)

Java轻量级锁原理详解(Lightweight Locking)

正确使用 Volatile 变量

Java 语言中的 volatile 变量可以被看作是一种 “程度较轻的 synchronized”;与 synchronized 块相比,volatile 变量所需的编码较少,并且运行时开销也较少,但是它所能实现的功能也仅是 synchronized 的一部分

锁提供了两种主要特性:互斥(mutual exclusion)可见性(visibility)

Volatile 变量具有 synchronized 的可见性特性,但是不具备原子特性。这就是说线程能够自动发现 volatile 变量的最新值。Volatile 变量可用于提供线程安全,但是只能应用于非常有限的一组用例:多个变量之间或者某个变量的当前值与修改后值之间没有约束。因此,单独使用 volatile 还不足以实现计数器、互斥锁或任何具有与多个变量相关的不变式(Invariants)的类(例如 “start <=end”)。 c

Java生成UUID

String s = UUID.randomUUID().toString()

Guidelines for Java Testable Design

Avoid complex private methods
Avoid final methods
Avoid static methods
Use “new” with care
Avoid logic in constructors
Avoid the Singleton
Favor composition over inheritance
Wrap external libraries
Avoid service lookups

Ways to create objects in java example . Use static factory methods to create instance of a class in java

1. Use new keyword and call to constructor
2.Use public static factory methods
3.getInstance()
4.Reflective methods for creating instances of classes :
5.Objects creation using Deserialisation :
6.Using Clone method to copy / clone objects of an exisiting object

Architecture

Event Collaboration

Message Bus a.k.a. Event Bus

Message Bus

转载:架构师接龙系列

2012年2月23日 admin 没有评论

一些知名的架构师的问与答,无论是问题还是答案都值得学习

架构师接龙:岳旭强 VS. 杨卫华

JDK 7给Web带来了什么?协程在老系统上的应用,有哪些挑战?怎么解决?

类似Twitter、新浪微博这样的应用,针对第三方开放API接口,如何避免少数应用程序因为用户量激增而对系统带来冲击?对请求数做限制之外有没有更为折衷的办法?

Web应用的性能、扩展性是业界比较关注的,但是可用性显然更重要,有什么关键措施和经验可以提高系统的可用性?

 

架构师接龙:腾讯高级工程师邝宇恒VS. 百度架构师侯震宇

你的团队会对所有代码进行代码评审吗?具体如何实施?如何评价代码评审的作用?

架构师接龙 飞信孙朝晖VS.139说客李祎

你们做灰度发布和A/B测试吗?如果做的话,在架构上是如何支持的?

目前你的组织内是否具备了根据性能需求动态伸缩的应用部署基础架构?如果有的话,是怎样建设的?如果还没有,你怎样看待这个问题?

在你们的系统中,是否在设计与开发阶段就预留功能降级的接口,以应对突发故障?请举例说明设计的原则和实施方法。

架构师接龙:黄冬&邓毅

大量的用户使用行为记录需要留存,而留存下的数据量非常大,对于相关的数据也要进行频繁和复杂的业务计算,对于这样的存储有什么解决方案吗?对于这样的分析型计算有什么有效的架构 ?

架构师接龙:盛国军&栾义来

我们知道缓存能够提升性能,但缓存有个致命的问题,就是对事实数据的改变不敏感。如何保持和协调缓存数据和事实数据的一致性?

架构师接龙 岑文初VS. 杨海朝

模块化来降低耦合性时如何把握模块划分的粒度?如何权衡复用性与粒度过细导致依赖复杂的矛盾?

如何处理高并发系统中缓存失效的场景?

目前是如何做好应用的依赖监控的?例如依赖缓存,是否知道缓存的命中率情况、使用率等;依赖外部服务,是否知道外部服务的消耗时间、成功失败情况等。

对于不同系统之间的耦合如何处理?比如前端系统要求快速响应大量的用户请求,但是依赖于后端的服务体系,而服务系统的瓶颈可能在数据库读写上,如何协同这样需求差异化系统工作?

对于系统优化,平时如何查找瓶颈,最后又如何确定优化后是有效的?

架构师接龙 杨海朝VS. 孙立

在错综复杂的庞大系统中,如何避免多条线频繁地发布新代码对线上业务的影响?

在设计一个大规模伸缩性服务时需要做好哪些准备?是否会考虑分区、故障、自动化、异步等方面的问题?

在架构设计中如何应对不断出现的超过预估的数据量和访问量?

架构师接龙 孙立VS. 孙朝晖

你如何看待横向扩展(Scale Out)和纵向扩展(Scale Up)?

大型网站往往会将多种语言进行融合使用,关于这方面,你有什么经验分享?

对于大型系统的突发性故障,如何在架构层面帮助快速定位故障的原因?

架构师接龙:林昊&黄冬

随着数据量的不断增长以及前端应用的不断水平扩充,数据库的压力会成为明显的问题,这个时候常用的方案是数据拆分,在数据拆分时有些什么较好的拆分方式,以及如何能够做到数据拆分后对已有程序不产生影响或产生很小的影响?

数据拆分只是解决数据量增长后带来的问题的一种解决方案,请问是否还有一些其他的方式来解决数据量增长带来的问题呢,以及如何来实现这些方式呢?

对于大型网站而言,经常要面对不可预知的热点事件带来的高流量,如何能够做到避免这样突发的高流量造成网站的不可用呢?

高度可伸缩是互联网追求的目标,基于您的经验,请提供一些构建高度可伸缩系统的最佳实践?

架构师接龙:盛大许式伟VS. 金山张宴

作为系统架构师,您一般会从哪些方面来保证网站的高可用性(降低故障时间)?

您在任务切分上,有什么经验分享?您通过哪些手段保证任务的独立性?

这些讨论中有很多直接学习和借鉴的内容,下面是我感兴趣的几个话题

  1. JDK7的新特性,包括GC和并发框架
  2. 如何进行代码Review
  3. 功能降级,以及如何不断出现的超过预估的数据量和访问量
  4. 如何保持和协调缓存数据和事实数据的一致性,以及如何解决缓存失效的问题
  5. 通过模块化来降低耦合度
  6. 分层接口化和组件化
  7. 服务化
  8. 应用监测
  9. 做好应用的依赖监控,例如依赖缓存,是否知道缓存的命中率情况、使用率等;依赖外部服务,是否知道外部服务的消耗时间、成功失败情况等。
  10. 系统之间耦合的处理
  11. 异步化、线程池化、事件驱动

Daniel-Journey Weekly Dose -2012/2/19

2012年2月20日 admin 2 条评论

Java

Java Socket实战之一 单线程通信

Java Socket实战之二 多线程通信

Java Socket实战之三 传输对象

Java Socket实战之四 传输压缩对象

JVM伪共享

disruptor – Concurrent Programming Framework 并发编程框架

How to Analyze Java Thread Dumps

Architecture

The LMAX Architecture

The LMAX Architecture(中文)

Tumblr架构 – 页面浏览量150亿/月并且比Twitter更难拓展

Pipe Comet

Servlet 3以前,一次http请求就由一个容器线程完成全部处理,容器线程的生命周期取决于整个业务处理的时间(如果后端有依赖系统,例如DB,集中式缓存,外部系统service),由此可见,并发处理请求的数量在容器线程池有限的条件下,直接用容器线程数量/rt(响应时间)即可得到。而容器线程是否真的需要有那么久的生命周期?在整个事务处理过程中是否可以被回收,等到需要时在申请?

ebay_architecture.pdf(2006)

eBay 的Scalability最佳实践

水平切分
避免分布式事务
虚拟化所有层次
Cache

再谈 eBay 的扩展性最佳实践

1)水平切分 Partition Everything

2)异步处理Asynchrony Everywhere

3)自动Automate Everything

4) 故障检测与回溯(Remember Everything Fails)

5)拥抱不一致(Embrace Inconsistency)

Web服务请求异步化介绍

SOA

SOA@eBay读后

SOA @ eBay : How is it a hit

Daniel-Journey Weekly Dose –2012/2/12

2012年2月13日 admin 没有评论

LINUX

linux中的inode简单介绍

Linux会为每一个文件分配一个唯一的inode节点。在linux中,文件的文件名、文件属性、文件内容是分别存储的:文件名存放在目录项(即 dentry)中,文件属性存放在inode中,文件内容存放在block中。Linux在查找文件时,首先先读取dentry,dentry中存储的文 件名和inode编号的一个映射表, 根据这个表找到inode编号,再根据inode找到磁盘中的文件。

Understand UNIX / Linux Inodes Basics with Examples

An Inode number points to an Inode. An Inode is a data structure that stores the following information about a file :

  • Size of file
  • Device ID
  • User ID of the file
  • Group ID of the file
  • The file mode information and access privileges for owner, group and others
  • File protection flags
  • The timestamps for file creation, modification etc
  • link counter to determine the number of hard links
  • Pointers to the blocks storing file’s contents
  •  

    $ stat DW.txt 

    File: `DW.txt’
    Size: 24908         Blocks: 56         IO Block: 4096   regular file
    Device: ca01h/51713d    Inode: 15696241    Links: 1
    Access: (0664/-rw-rw-r–)  Uid: (  505/   admin)   Gid: (  505/   admin)
    Access: 2011-11-03 18:45:29.000000000 +0800
    Modify: 2011-11-03 18:38:33.000000000 +0800
    Change: 2011-11-03 18:38:33.000000000 +0800

Linux Performance Monitoring and Tuning Introduction

UNIX Process Overview (Inside a Linux Process, and Types of Process)

7 Practical PS Command Examples for Process Monitoring

List Currently Running Processes (ps -ef, ps -aux)

 

List the Process based on the UID and Commands (ps -u, ps -C)

ps -f -u wwwrun,postfix

ps -f -C tatad.pl

List the processes based on PIDs or PPIDs (ps -p, ps –ppid)

ps -f –ppid 9576
ps -f  -p 25009,7258,2426

List Processes in a Hierarchy (ps –forest)

ps -e -o pid,args –forest

List all threads for a particular process (ps -L)

ps -C java -L -o pid,tid,pcpu,state,nlwp,args

Finding memory Leak (ps –sort pmem)

ps aux –sort pmem

6 Stages of Linux Boot Process (Startup Sequence)

Bg, Fg, &, Ctrl-Z – 5 Examples to Manage Unix Background Jobs

Executing a background job

Appending an ampersand ( & ) to the command runs the job in the background.

Sending the current foreground job to the background using CTRL-Z and bg command
  • Press ‘CTRL+Z’ which will suspend the current foreground job.
  • Execute bg to make that command to execute in background.
  • View all the background jobs using jobs command

     

    Taking a job from the background to the foreground using fg command

      fg %1 will bring the job#1 (i.e download-file.sh) to the foreground.

Kill a specific background job using kill %

kill %2

Linux / Unix Command: ps

Linux下ps命令详解

linux上进程有5种状态:
1. 运行(正在运行或在运行队列中等待)
2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)
3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)
4. 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)
5. 停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)

ps工具标识进程的5种状态码:
D 不可中断 uninterruptible sleep (usually IO)
R 运行 runnable (on run queue)
S 中断 sleeping
T 停止 traced or stopped
Z 僵死 a defunct (”zombie”) process

au(x) 输出格式 :
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
USER: 行程拥有者
PID: pid
%CPU: 占用的 CPU 使用率
%MEM: 占用的记忆体使用率
VSZ: 占用的虚拟记忆体大小
RSS: 占用的记忆体大小
TTY: 终端的次要装置号码 (minor device number of tty)
STAT: 该行程的状态:
D: 不可中断的静止
R: 正在执行中
S: 静止状态
T: 暂停执行
Z: 不存在但暂时无法消除
W: 没有足够的记忆体分页可分配
<: 高优先序的行程
N: 低优先序的行程
L: 有记忆体分页分配并锁在记忆体内 (即时系统或捱A I/O)
START: 行程开始时间
TIME: 执行的时间
COMMAND:所执行的指令

PS命令常用用法

ps a 显示现行终端机下的所有程序,包括其他用户的程序。

ps -A 显示所有程序。

ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。

ps -e 此参数的效果和指定"A"参数相同。

ps e 列出程序时,显示每个程序所使用的环境变量。

ps f 用ASCII字符显示树状结构,表达程序间的相互关系。

ps -H 显示树状结构,表示程序间的相互关系。

ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。

ps s 采用程序信号的格式显示程序状况。

ps S 列出程序时,包括已中断的子程序资料。

ps -t<终端机编号> 指定终端机编号,并列出属于该终端机的程序的状况。

ps u 以用户为主的格式来显示程序状况。

ps x 显示所有程序,不以终端机来区分。

最常用的方法是ps -aux,然后再利用一个管道符号导向到grep去查找特定的进程,然后再对特定的进程进行操作。

Investment

【经济周期六个阶段】第1阶段经济下滑期:仅有债券是牛市。第2阶段:仅有商品是熊市。第3阶段经济复苏期:都是牛市。第4阶段:只有债券是熊市。第5阶段:只有商品是牛市。第6阶段经济滞胀期:都是熊市

JAVA

JVM -XX: 参数介绍

Understanding JVM Internals

Master/worker or P2P Grid? How about You choose?

JPPF

JPPF makes it easy to parallelize computationally intensive tasks and execute them on a Grid.

CPU 占用过高 (查看Java堆)

常用的Linux系统监控命令

nid : 对应的linux操作系统下的tid

tid: 这个应该是jvm的jmm内存规范中的唯一地址定位,如果你详细分析jvm的一些内存数据时用得上

Programming

再读《重构》

重构的意义之一也是提高开发进度。杀手锏是”不要告诉经理“。

The benefits of reducing memory consumption

Working set size

Subversion Tip of the Week-Recovering Deleted Items

svn log –verbose

This will list all of the changed items in each revision, allowing you to pinpoint the revision where you deleted the file.

svn merge {revision number}

svn copy {revision number}

SOA

服务治理过程演进

服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?
为了解决这些问题,第一步,要将服务现在每天的调用量,响应时间,都统计出来,作为容量规划的参考指标。
其次,要可以动态调整权重,在线上,将某台机器的权重一直加大,并在加大的过程中记录响应时间的变化,直到响应时间到达阀值,记录此时的访问量,再以此访问量乘以机器数反推总容量。

服务多了,沟通成本也开始上升,调某个服务失败该找谁?服务的参数都有什么约定?
这时就需要登记每个服务都是谁负责的,并建立一个服务的文档库,方便检索。

慢慢一些敏感数据也都服务化了,安全问题开始变得重要,谁能调该服务?如何授权?

这样的服务可能需要一个密码,访问时需带着此密码,但如果用密码,要改密码时,就会很不方便,所有的消费方都要改,所以动态生成令牌(Token)可能会更好,提供方将令牌告之注册中心,由注册中心决定是否告之消费方,这样就能在注册中心页面上做复杂的授权模型。

就算是不敏感的服务,也不是能任意调用,比如某服务突然多了一个消费者,这个消费者的请求量直接把服务给拖跨了,其它消费者跟着一起故障。

首先服务提供方需要流控,当流程超标时,能拒绝部分请求,进行自我保护。
其次,消费者上线前和提供者约定《服务质量等级协定(SLA)》,SLA包括消费者承诺每天调用量,请求数据量,提供方承诺响应时间,出错率等,将SLA记录在监控中心,定时与监控数据对比,超标则报警。

虽然有SLA约定,如果不能控制,就只是君子协定,如何确保服务质量?
比如:一个应用很重要,一个不那么重要,它们调用同一个服务,这个服务就应该向重要应用倾斜,而不是一视同仁,当支撑不住时,应限制不重要应用的访问,保障重要应用的可用,如何做到这一点呢。这时,就需要服务路由,控制不同应用访问不同机器,比如:
应用分离:
consumer.application = foo => provider.host = 1,2,3
consumer.application != foo => provider.host = 5,6
读写分离:
method.name = find*,get* => provider.host = 1,2,3
method.name != find*,get* => provider.host = 5,6

随着服务的不停升级,总有些意想不到的事发生,比如cache写错了导致内存溢出,故障不可避免,每次核心服务一挂,影响一大片,人心慌慌,如何控制故障的影响面?服务是否可以功能降级?或者资源劣化?

应用间声明依赖强度,哪些功能强依赖,哪些弱依赖,然后基于依赖强度,计算出影响面,并定期测试复查,加强关键路径上的服务的优化和容错,清理不该在关键路径上的服务。

分类: 阅读 标签: , , , ,

Daniel-Journey Weekly Dose –2012/2/5

2012年2月5日 admin 没有评论

Windows

Windows 7中Telnet功能安装与测试

Programming

我们什么时候应该使用异常?

错误码

1. 错误信息不丰富
2. 加入错误状态码可能需要改变函数签名
3. 错误状态码可能会被忽略

 

Cloud

谁来拯救云计算

Scalability

Write Through Cache

Cache is a component that will magically store data so that future requests of that same data will not be to the Remote Server, and hence it will improve the performance of our application significantly faster.

Operations

Java应用运维

Architecture

关于排队系统

对事件驱动的消息订阅的再思考

浅谈架构

如果要更正式点定义,架构就是model和pattern,从而把code串成system。而其中最重要的就是design principles (设计原则),即为什么这个问题要用这个而非那个。更文艺点,再结合点美学,也可以叫作design philosophy (设计哲学或理念)。

然后我们来看什么是model和pattern,这两个具体的定义我还没想出来。先说一下比较,model偏宏观,而pattern偏微观;model重抽象描述,而pattern重具体实现。比如,你的系统有一个服务端和一个客户端,那么client/server就是model,而client与server之间的交互方式则是pattern,比如RPC/message、同步/异步,比如用滑动窗口来组织请求与应答等等。当然,这和系统的尺度有关。如果你zoom in到服务端,此时的model可能就是模块的组织关系,而pattern则是调用方式,比如用function call还是event等。

架构是什么:其实"架构", 就是一个人用于解决常见(注意常见)设计问题的特定方法…

经常有人把"架构"说的很玄乎,很虚. 其实"架构", 就是一个人用于解决常见(注意常见)设计问题的特定方法(注意特定的, 但不一定是一个). 遇到问题稍许有些变化, 他能适当的调整自己的常用(注意常用)设计而去适合这个变化的能力. 这就叫:"架构"设计… 也就是说, 架构是:方法论, 是经验, 更是变通能力.

Reactor模式和NIO

Reactor模式,或者叫反应器模式

Java

 

使用Jakarta Commons Pool处理对象池化

对于没有状态的对象(例如String),在重复使用之前,无需进行任何处理;对于有状态的对象(例如StringBuffer),在重复使用之前,就需要把它们恢复到等同于刚刚生成时的状态。由于条件的限制,恢复某个对象的状态的操作不可能实现了的话,就得把这个对象抛弃,改用新创建的实例了。

Java克隆

Java Support for Large Memory Pages

Java HotSpot VM (Virtual Machine) Performance Tuning: Command-line options

Solving OutOfMemoryError (part 5) – JDK Tools

jps -lvm

-m Output the arguments passed to the main method. The output may be null for embedded JVMs.
-l Output the full package name for the application’s main class or the full path name to the application’s JAR file.
-v Output the arguments passed to the JVM.