linux单目录文件不要过多,多少是过多?

我们都知道一个文件夹文件不宜过多,文件过多,会导致性能下降,那到底怎样算过多呢?

今天板子决定蹂躏下自己的新mac

因本文旨在讨论相同状态下,性能随单目录文件数量变化而发生的变化,所以未做其他特别设置

准备:
Mac Pro (ssd)一台 (安装ubuntu 12.04 虚拟机 LNMP 环境)
5个文件夹,各分别包含1w、5w、10w、50w、100w个同样内容小文件
压测命令:ab -n 10000 -c 100 ‘http://s1.localhost.com/files.php?num=xxx’

files.php:

$num = empty($_GET['num']) ? 10000 : $_GET['num'];
echo file_get_contents("/..filepath../$num/file_".rand(1,$num));

以下是测试结果:

继续阅读

mysql索引需要了解的几个注意

板子之前做过2年web开发培训(入门?),获得挺多学生好评,这是蛮有成就感的一件事,准备花点时间根据当时的一些备课内容整理出一系列文章出来,希望能给更多人带来帮助,这是系列文章的第一篇

注:科普文章一篇,大牛绕道

索引是做什么的?

索引用于快速找出在某个列中有一特定值的行。不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行。
表越大,花费的时间越多。如果表中查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要看所有数据。

大多数MySQL索引(PRIMARY KEY、UNIQUE、INDEX和FULLTEXT)在B树中存储。只是空间列类型的索引使用R-树,并且MEMORY表还支持hash索引。 继续阅读

分析pdf文件总页数+fgets()函数无法识别换行符问题

有个小需求,批量分析一批pdf文件的总页数,写(找)了个小函数,如下:


function getPageTotal($path){
    if (!$fp = @fopen($path, 'r')) {
        return false;
    }
    $max=0;
    while(!feof($fp)) {
        $line = fgets($fp,255);
        if (preg_match('/\/Count [0-9]+/', $line, $matches)){
            preg_match('/[0-9]+/',$matches[0], $matches2);
            if ($max<$matches2[0]) $max=$matches2[0];
        }
    }
    fclose($fp);
    return $max;
}

实际使用中,发现有极个别文件识别失败,取样分析后,发现出问题的文件都是mac格式的,那自然就是fgets对mac换行符的识别问题了

查了下手册: fgets

Note: If PHP is not properly recognizing the line endings when reading files either on or created by a Macintosh computer, enabling the auto_detect_line_endings run-time configuration option may help resolve the problem.

auto_detect_line_endings 这个运行时配置到是从没注意过,ok、稍作修改


function getPageTotal($path){
    ini_set("auto_detect_line_endings",true);

    if (!$fp = @fopen($path, 'r')) {
        return false;
    }
    $max=0;
    while(!feof($fp)) {
        $line = fgets($fp,255);
        if (preg_match('/\/Count [0-9]+/', $line, $matches)){
            preg_match('/[0-9]+/',$matches[0], $matches2);
            if ($max<$matches2[0]) $max=$matches2[0];
        }
    }
    fclose($fp);
    return $max;
}

问题解决!

关于auto-detect-line-endings的解释:

When turned on, PHP will examine the data read by fgets() and file() to see if it is using Unix, MS-Dos or Macintosh line-ending conventions.

This enables PHP to interoperate with Macintosh systems, but defaults to Off, as there is a very small performance penalty when detecting the EOL conventions for the first line, and also because people using carriage-returns as item separators under Unix systems would experience non-backwards-compatible behaviour.

Note: This configuration option was introduced in PHP 4.3.0

写在thinkinlamp首届架构师大会之后

考虑到本博读者以女性居多,先上个福利图吧

thinkinlamp4位联合创始人,左起,板子,民工,三马,锅巴

废话篇

17日的大会也有些天了,是该总结下了,打分?89.9, 应该不算过分吧

世事往往如此,想要多少成功的喜悦,就得付出多少辛苦的汗水,因为这篇文章主要不是用来诉苦,所以我是不会告诉你非商业化的技术大会,拿到商业化的赞助是有多难,紧靠业余时间服务几百位买了本票的“上帝”是有多不容易,即便是当天,也是布场到次日3点到家,到家后还要整理东西,第二天7点半又要赶到会场是有多累等等,不过,还是上几张图吧

大会前夜11点开始安装背景板

 

大会前夜流水线封装入场礼品袋

 

布置完毕的会场

不过,这些都不重要了,原因马上你也会看到了

大会篇 继续阅读

特定场景下,别忘了optimize table

前几日,从日志发现个请求相应异常慢,看了下,是个用mysql实现的一个任务队列,登录上去

show processlist

发现某语句执行异常慢,挺奇怪,一个常年只有几百行的表,怎么会这么慢呢

show table status;
t_task        | MyISAM |      10 | Dynamic    |      84 |            346 |    19547784 |    281474976710655 |       705536 |  19518652 |           NULL | 2011-11-20 09:38:20 | 2012-03-15 16:30:03 | NULL       | utf8_general_ci |     NULL |
恍然大悟
346行数据,却有19M了
optimize table t_task
ok,问题解决
原因分析:可变长度表,大量的插入删除,数据文件碎片太多,导致异常
结论:可变长度,存在大量插入删除修改操作的表,别忘了时常optimize一下,也可酌情考虑改成定长的(ps:对于utf8来说,为了保证定长,char(1)即使是插入1个数字,也是3字节哦)
看下手册怎么说的optimize table吧,中文版:

13.5.2.5. OPTIMIZE TABLE语法

OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE <em>tbl_name</em> [, <em>tbl_name</em>] ...

如果您已经删除了表的一大部分,或者如果您已经对含有可变长度行的表(含有VARCHAR, BLOB或TEXT列的表)进行了很多更改,则应使用OPTIMIZE TABLE。被删除的记录被保持在链接清单中,后续的INSERT操作会重新使用旧的记录位置。您可以使用OPTIMIZE TABLE来重新利用未使用的空间,并整理数据文件的碎片。

在多数的设置中,您根本不需要运行OPTIMIZE TABLE。即使您对可变长度的行进行了大量的更新,您也不需要经常运行,每周一次或每月一次即可,只对特定的表运行。

OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用。

对于MyISAM表,OPTIMIZE TABLE按如下方式操作:

1. 如果表已经删除或分解了行,则修复表。

2. 如果未对索引页进行分类,则进行分类。

3. 如果表的统计数据没有更新(并且通过对索引进行分类不能实现修复),则进行更新。

对于BDB表,OPTIMIZE TABLE目前被映射到ANALYZE TABLE上。对于InnoDB表,OPTIMIZE TABLE被映射到ALTER TABLE上,这会重建表。重建操作能更新索引统计数据并释放成簇索引中的未使用的空间。请参见13.5.2.1节,“ANALYZE TABLE语法”

使用—skip-new或—safe-mode选项可以启动mysqld。通过启动mysqld,您可以使OPTIMIZE TABLE对其它表类型起作用。

注意,在OPTIMIZE TABLE运行过程中,MySQL会锁定表。

OPTIMIZE TABLE语句被写入到二进制日志中,除非使用了自选的NO_WRITE_TO_BINLOG关键词(或其别名LOCAL)。已经这么做了,因此,用于MySQL服务器的OPTIMIZE TABLE命令的作用相当于一个复制主服务器,在默认情况下,这些命令将被复制到复制从属服务器中。

win7用不了telnet?安装下就好

今天在家里办公,vpn连上后,需要telnet下,发现win7下telnet客户端默认状态是没安装的(有,只是没开启)

安装方法也很简单

打开控制面板  -》程序和功能  -》左上方的“打开或关闭windows功能”  -》弹出windows功能的对话框  -》找到TelnetClient(中文系统是telnet客户端),打上勾  -》ok!!