the notebook of eyu

2014-11-30
linux系统性能监控与优化--memory

linux系统性能监控与优化--memory

虚拟内存以页的方式管理,一般为4K,如果配置了大页,则为2M

The Page Frame Reclaim Algorithm.(PFRA)

PFRA根据页的类型来释放内存。

页类型:

  • 不能释放的页:加锁的页,内核页,保留的页
  • 可交换的页:匿名内存页
  • 同步的页:有对应磁盘文件的页
  • 可废弃的页:static pages discarded pages
  • 除了第一种页不能回收,其它都可以被PFRA回收。
Read More

2014-11-28
数据库行存储格式

数据库行存储格式

调研的几种数据库的行格式,代码没看,查的文档,可能具体实现并不一致。
几种格式的优缺点,还有待分析。
在oceanbase0.5中,实现的格式太简单,在一些场景下性能差,或是不太方便。
在oceanbase1.0中,现在我打算是写成一个通用的接口,可以以表为单位选择需要的格式,这个有待讨论。

Read More

2014-11-09
为什么不能直接将立即数写入段寄存器

为什么不能直接将立即数写入段寄存器

在看《一个操作系统的实现》这本书的时候,给段寄存器赋值都是这样执行的:

1
2
mov ax, cs
mov ds, ax

或是

1
2
mov ax, 段基址
mov gx, ax

为什么8086的设计是不能拼接给段寄存器赋值,而是要借助通用数据寄存器。

查了些资料也没有得到好的解释。

有一种说法是:数据总线只与数据数据寄存器相连,并没有与段寄存器相连,但这个说明只是说出了最终的设计,并没有说到原因,而且也不能解释为什么不能使用mov ds, cs这种段寄存器之间的赋值也不允许。

还有一种说明是:段寄存器只在有限的场合有用,大部分情况下是自动设置的,不需要应用程序编写者手动改变其中的值,所以如果增加这种指令通路没有必要,会增加复杂度,所以没有这样设计。这种说法说的有一定道理。

Read More

2014-10-31
关于-fno-omit-frame-pointer与-fomit-frame-pointer

关于-fno-omit-frame-pointer与-fomit-frame-pointer

在GDB core的时候,经常去查看EBP,ESP寄存器,来查找一些有用的调用信息,但是感觉这个EBP,ESP中值的变化,并不是像书中描述的那种函数调用的标准流程。

在用perf做性能分析,打印函数的调用路径时,打印调用路径也有问题。
后来才清楚,原来是-fno-omit-frame-pointer这个优化导致的问题。

Read More

2014-09-29
linux优化使用SSD的方法

文件系统层

原理

减少不必要的写,可以提升SSD的性能,并增加SSD的寿命。

方法1:不记录文件的最后访问时间

一些linux发行版,会记录文件的最后访问时间,所以每次访问一个文件,都会更新元数据,产生大量的写操作,所以当不关心最后访问时间的话,可以打开这个选项。
vim /etc/fstab
/dev/sda1 / ext3 noatime 0 0

方法2:TRIM机制

如果没打开TRIM机制,操作系统仅公将其标记为删除,实际磁盘上并没有删除,这对于传统磁盘是没有问题的,传统磁盘可以在一次操作中,修改磁盘数据。但是对于SSD来说,要先擦除,然后才能写,需要两次操作。如果打开了TRIM机制,删除文件时,会擦除相应的块,所以下次写的时候,仅需要一次操作就可以了。

磁盘调度算法

CFQ:针对机械磁盘设计的算法,不适用于SSD。
Deadline:在高写压力下,保证读的RT。
NOOP:FIFO
修改调度算法:
echo deadline > /sys/block/sda/queue/scheduler

swap和tmp

swap分区尽量放到机械磁盘上而不是SSD。
如果内存足够够的话,可以关闭swap。echo 0 > /proc/sys/vm/swappiness
tmp尽量使用内存(ram disk),而不是建在实际硬盘上。

应用

对于过度使用硬盘的应用,如浏览器的缓存,最后建在机械硬盘上,而不要建在SSD上。

分区对齐

分区对齐对于SSD来说非常重要,因为在SSD上,读和写都是以页(包含多个块)为单位进行的。如果分区没有对齐,当文件系统写的块大小与SSD的块大小没有对齐的话,当数据跨页边界话,会造成对磁盘的多次访问。

参考资料

http://apcmag.com/how-to-maximise-ssd-performance-with-linux.htm

Read More

2014-08-24
径山骑行

径山环境很好,特别是从207国道到径山脚下那一段。

山上的饭菜也很便宜:两菜+可乐+两个玉米,才收了35元,超好吃。

下山很爽不需要踩踏板。

上山很痛苦。

寺庙很幽静悠闲,人不多

Read More

2014-08-21
double_write

Innodb Double Write原理

基本原理就是将数据写两份
将Dirty Page刷到磁盘时,先将Page刷到磁盘上的一个区域tablespace,然后择机将Page拷贝到数据文件对应位置。
tablespace是innodb在磁盘上分配的一块区域,包含100个Page。
而每个Page都有自己的checksum,来校验本身数据的正确性。

Read More

2014-08-16
绍兴骑行






Read More

2014-06-18
与switch–case相关的性能优化

与switch–case相关的性能优化

去年做性能优化的时候写过一篇与switch优化相关的文章http://www.trueeyu.com/?p=1156,今天无意中看到了一篇感觉不错,翻译一下。

Read More

2014-05-29
glibc读写锁与linux内核读写自旋锁的原理

glibc读写锁与linux内核读写自旋锁的原理

glibc读写锁的原理

加读锁:
int __pthread_rwlock_rdlock(pthread_rwlock_t* rwlock);
(nptl/pthread_rwlock_rdlock.c)

加写锁:
int __pthread_rwlock_wrlock(pthread_rwlock_t* rwlock)
(nptl/pthread_rwlock_wrlock.c)

解锁:
int __pthread_rwlock_unlock(pthread_rwlock_t* rwlock)
(nptl/pthread_rwlock_wrlock.c)

默认读写锁是读优先的,如果有写者在等待锁,不会阻塞读者。
如果配置为写优先,如果有写者在等待锁,所有的后续的读者加锁都会阻塞。
但是当占有读者锁的读者数为0时,当有写者在等待时,会优先唤醒写者。
当配置为读者优先时,会出现写者饿死的情况
当配置为写者优先时,会出现读者饿死的情况
读写锁适用于读多写少的场景

Read More