[科学院手记]人人网新鲜事分享现场转播

讲座已经开始,现在是人人网牛人张洁介绍。

----

现在是新鲜事后台架构牛人铁安在讲解新鲜事要完成的功能:

将一个用户产生的内容实时发送给与他相关的一群人。

尽可能地帮助用户保存内容。

现在面临的挑战

分发压力:5000W*100 全天分发的总量在五十亿左右。每秒分发的次数是六万次每秒。

现在有1.3t的内存占用。

----

老版本的新鲜事结构

----

新的系统结构

分发之后,内容本体丢进cache和db,dispatch服务通知到相关的人,分发后来的结构保存一人一条到TC

---

MENU

技术细节部分

分发部分的策略优化:瞬间分发海量数据,光良首页的例子(一百万的粉丝同时产生)。产品策略优化。

内存压缩技术:新鲜事内存结构(FlyWeight),字符串压缩存储(QuickLZ)

新鲜事存储方案

----

内存压缩技术:flyweight的设计

只要对象存在,所有的指针都能找到正确的内容。

boost::flyweight在高并发情况下有效率问题,自己实现了相同的功能。

各种压缩办法的性能比较:

QuickLZ的压缩比不是最高的,但解压缩是最快的;代码简单;支持追加方式的压缩;有成熟的商业应用。

boost::multi_index介绍 用来做多视图显示的东东 提供三种不同的索引方式

一段例子代码 c++代码。。。略鸟

-------

新鲜事存储方案

TC+Direct IO + SSD

key-value DB的一个表。

研究的三个开源项目:

Hypertable

tokyo tyrant

MemcacheDB (哈哈,测试了两个张宴兄弟的东东,感叹一下下,张宴兄弟在nginx和tt的文档贡献真是不浅)

TC的测试结果

读取很少的数据的情况下读和写都很快,在几个G之内的数据文件,数据量增加到一定程度写入会持续下降。100G一秒只能写入六七百次。所以单纯使用TC是不现实的。

新的方案

所有的写合并;通过LOG保证Down机后数据恢复;使用TC保存索引;使用异步IO读写文件;使用DirectIO怎么OS的Cache策略;使用SSD解决大量的并发读取。

SSD随机读和顺序读速度接近。五六万每次的速度。

-------

全场结束,答疑

-------

当幸福来敲门

我们都一样
一样的善良
一样为需要的人打造一个天堂
歌声是翅膀
唱出了希望
所有的付出只因爱的力量
和你一样
我们都一样
谁在最需要的时候轻轻拍着我肩膀
谁在最快乐的时候愿意和我分享
日子那么长
我在你身旁
见证你成长
永远为你鼓掌

因为失去过,所以才懂得珍惜,因为失去过,所以才怕再次失去,因为失去过,所以才懂得享受幸福。

当幸福来敲门

史密斯先生随手提的笨重的仪器,具有压垮脆弱人生巨大的负荷,压抑的感觉充满心灵,持续不断。

当幸福来敲门的时候

最后喘出的气息,天高云淡的感觉,豁然开朗,理解幸福与快乐,学会幸福与快乐。

一月之后,是新的一年,心情超好,呼,好久没有喘气的感觉。

ubuntu9.10里的firefox不显示DNS Flusher插件的解决办法

ubuntu 9.10里的firefox是3.55版本的,DNS Flusher是个很好用的快速切换dns的插件。

ubuntu下是大小写敏感的,而DNS Flusher的作者似乎只是个windows用户。

修改这个文件:

vim /home/cc/.mozilla/firefox/icj6nr4a.default/extensions/{7d575baa-b543-11dc-8314-0800200c9a66}/chrome.manifest (根据你的情况自己修改下目录)

然后修改这个文件里的第一行和第二行里的两个overlay,将里面的dnsFlusher.xul都改成dnsflusher.xul,注意,只修改前面两个overlay,后面的content和skin无需修改。

Ubuntu 9.10下linuxqq经常挂掉的解决方案

ubuntu 9.10下linuxqq(官方的QQ,八百年不更新的那个了)

sudo vim /usr/bin/qq
增加
#!/bin/sh

export GDK_NATIVE_WINDOWS=true

cd /usr/share/tencent/qq/

./qq 经试验正确无误。。。linuxqq不再挂。。。五四陈科学院小道报道

Ubuntu 9.10安装配置eclipse、subclipse、m2eclipse(svn插件和maven插件)

ntfs硬盘安装ubuntu 9.10方案见: x200 ntfs硬盘安装ubuntu9.10正式版手记 eclispe 3.51安装:

sudo apt-get install eclipse
整完会在应用程序中多出来一项“编程”。

此时的eclipse是以自带的jre来运行的,后面的maven插件会要求eclipse在jdk里运行,而不是jre里,所以再安装一下jdk:

sudo apt-get install sun-java6-jdk
这样,jdk会安装到/usr/lib/jvm/java-6-sun

然后修改eclipse.ini

sudo vim /usr/lib/eclipse/eclipse.ini
在-vmargs上一行加入:
-vm
/usr/lib/jvm/java-6-sun-1.6.0.15/bin

(有回车) 同时选择一下window->preferences->java->installed jres增加对应目录的jre

然后开始 Help->install new software

subclipse http://subclipse.tigris.org/update_1.2.x

安装好subclipse。subclipse提供了svn的支持。

然后同样安装m2eclipse插件:

m2eclipse比较麻烦,需要依次安装的有:

emf http://download.eclipse.org/modeling/emf/updates/releases/

cdt http://download.eclipse.org/tools/cdt/releases/new

wtp http://download.eclipse.org/webtools/updates

ajdt http://download.eclipse.org/tools/ajdt/34/update

zest or GEF http://download.eclipse.org/tools/gef/updates/releases/

mylyn http://download.eclipse.org/tools/mylyn/update/e3.4 最后才是m2eclipse:

http://m2eclipse.sonatype.org/update/
注意,在安装过程中,有些update的url里有不止一个版本的选项,注意适当选取。

X200 ntfs硬盘安装ubuntu9.10正式版手记

09年10月31日,9.10发布了正式版本,科学院曾经出过两篇硬盘安装的手记,一个是8的一个是9.10测试版本的。地址是: [十一归来]ubuntu 9.10 硬盘安装手记 ubuntu 8.10 desktop版本 硬盘安装手记

先说平时我们用wingrub安装的时候,是不支持ntfs的,只能用grub for dos的grldr文件(grub4dos的这个文件支持ntfs)。

下载iso文件:ubuntu-9.10-desktop-i386.iso

同上一文,我列出使用的boot.ini和menu.lst:

boot.ini

[boot loader]
timeout=30
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS
[operating systems]
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect
C:\GRLDR="wingrub"
menu.lst
timeout 10

title Windows at (hd0,0)
root (hd0,0)
chainloader +1

title install Ubuntu9.10
root (hd0,0)
kernel (hd0,0)/vmlinuz boot=casper iso-scan/filename=/ubuntu-9.10-desktop-i386.iso ro quiet splash –
label check live-install
initrd (hd0,0)/initrd.lz 然后,iso文件放在D盘,用RAR打开iso文件,解压出来initrd.lz和vmlinuz两个文件。

重启电脑,进入desktop,双击安装。

最后的时候运行一下umount -l /isodevice

安装结束后,重启进系统,中文不全,选择一下最快的源,联网下语言包。

thinpad x200 所有硬件全部正常可使用。

人人网内部培训:java并发编程原理-synchronize Volatile-张洁大侠

来自人人网内部培训的最新消息:

时间今天下午不明时间,一群人在张洁大侠的培训下,对java并发编程原理-synchronize volatile等进行了激励的讨论和学习。出席本次会议的有。。。

言归正传,说,并发,就会出现锁。

1.互斥锁实现算法

使用一个并发队列:

do{

pre=head;

newNode->next=prev;

}while(!cas(head,prev,newNode)); 此代码中cas是作系统提供的compare and swap接口,能保证原子性作(类似memcache的cas)。

2.编译器指令优化使内存指令重排序与并发编程

并发的程序会受到指令重排序的影响,顺序执行的程序逻辑不会受影响。

例子:

int a=b=0;

Thead1

{

a=1;

b=2

}

Thread2

{

if(b==2)

{

System.out.println(a); //这个a会是多少?

}

} 上例中Thread2并不一定会打出1来,因为在Thread1中的两个指令会被编译器优化时交换了顺序,出现了与我们想像中不一样的逻辑。

3.增加synchronize抑制内存指令重排序

synchronize的作用是什么呢,经常都说是同步,市面上的说法是,jvm在运行的时候,变量会在本地有一个内存区,另外还有一个主存区,同步的含义就是将本地的值同步到主存去。

这个说法没有明确的错误,而且在一定程度上还能帮助你理解synchronize的作用,然而内部真正的原因,是利用synchronize建立内存屏障,使其能够抑制内存指令的重排序,从而使并发程序达到我们想像中的逻辑。

int a=b=0;

Thead1

{

synchronized(this)

{

a=1;

b=2;

}

}

Thread2

{

synchronized(this)

{

if(b==2)

{

System.out.println(a); //这个a会是多少?

}

}

} 这样子,代码就不会有逻辑上的问题。

4.增加volatile建立内存屏障

volatile简化了synchronized,原理是一样的。

在增加了volatile后,那个变量所使用的位置就立起了一道 内存屏障,前后的指令顺序都不可打乱。

int a=0;

volatile  int b=0;

Thead1

{

a=1;

b=2;

}

Thread2

{

if(b==2)

{

System.out.println(a); //这个a会是多少?

}

} 这就可以简化上一个程序。

5. synchronize的object(class\this)

synchronized(object)

{

dosomething();

} 这里的object其实是为了使用其上的锁,代码等价如:

object.lock.lock();

dosomething();

object.condition.wait();

object.lock.unlock(); 【科学院两小时记忆版资料,非原版ppt内容,其中有误的地方定期更正】