Archive for the ‘linux’ Category.

MySQL binlog相关源码浅析

今天整理了一些MySQL binlog相关的原理,代码结构和源码函数调用,不敢藏私。

整理的内容主要针对以下四个问题:

  1. binlog文件的逻辑、物理表现形式
  2. slave io到底是怎么连上Master的
  3. sql线程是怎么读取二进制信息,应用到本地MySQL的
  4. binlog_format=ROW格式下,MySQL是怎么用二进制保存一行数据中不同数据类型的

一、binlog文件和文件的逻辑、物理表现形式

1. binlog文件

binlog文件主要包括:

  1. mysql-bin.000001
  2. mysql-bin.index

其中:

mysql-bin.index内保存着server中未purge的binlog文件,以“文本”形式保留的。

mysql-bin.index的内容示例:

mysql-bin.000001是真正的binlog文件,它是以“二进制”形式存在,对它的读必须使用特殊的工具(mysqlbinlog)才能以人能看得懂的方式打印出来。

2.binlog文件格式

mysql-bin.index没啥可说的,我们专门看一下二进制binlog文件。

binlog文件格式有以下特点:

  1. binlog是由event组成,event是binlog的逻辑最小单元。
  2. 文件头的头四个字节为BINLOG_MAGIC(fe 62 69 6e)
  3. 紧接着这四个字节的是 descriptor event : FORMAT_DESCRIPTION_EVENT
  4. 文件的末尾是 log-rotation event: ROTATE_EVENT
  5. 这两个event中间是各种不同的event,每个event代表Master上不同的操作。

下面对基本比较关键的概念进行说明:

  • BINLOG_MAGIC

利用hexdump -C 读取mysql-bin.000005的内容,

这里分别以十六进制和ASCII码展示显示,我们可以看到binlog的头四个字节是固定的:fe 62 69 6e,后三个字符ASCII码为bin,指明展示一个binlog文件。这四个字节成为 BINLOG_MAGIC。

  • event

mysqlbinlog -vvv 读取mysql-bin.000011的内容示例:

这里可以看到,第一个event是FORMAT_DESCRIPTION_EVENT,它记录了这个binlog的版本(MySQL 5.0以后binlog 的版本都是4)。最后一个event,是ROTATE_EVENT,它记录了切换到下一个binlog文件的文件名。

在它们两个之间是各种其他的event,目前的event类型有:

当然,内部已经有部分event被弃用了,我们不一一列举,这里只简单介绍几个平时经常见到的:

  • QUERY_EVENT :用于具体的SQL文本。如果binlog_format=statement方式下,insert,update,delete等各种SQL都是以Query event记录下来的。
  • WRITE_ROWS_EVENT,UPDATE_ROWS_EVENT,DELETE_ROWS_EVENT : 在binlog_format=row方式下,insert,update,delete操作的行信息分别以这三种event记录下来。
  • GTID_LOG_EVENT:5.6的GTID模式下,每个事务的GTID序号被记录到这种EVENT中。
  • PREVIOUS_GTIDS_LOG_EVENT :5.6的GTID模式下,这个event记录了生成这个binlog之前,MySQL已经执行的所有事务的GTID集合

二、slave io在源码中是怎么连上Master的

这里主要描述源码中的函数调用关系

1. slave如何注册并请求master 的binlog

slave io线程对应的入口函数为sql/rpl_slave.cc:handle_slave_io()

该函数核心主要是做了以下三个事情:

  1. safe_connect(thd, mysql, mi)
  2. register_slave_on_master(mysql, mi, &suppress_warnings)
  3. request_dump(thd, mysql, mi, &suppress_warnings)
  4. event_len= read_event(mysql, mi, &suppress_warnings);

也就是说,它先以标准的连接方式连上master MySQL,然后把自己注册到master上去,接着调用request_dump向master请求binlog数据,最后一个一个event读取并存放到本地relay log中。

  • safe_connect

连接MySQL的标准方式,MySQL c的connector也是用这种方式连接MySQL server的。

  • register_slave_on_master

register_slave_on_master核心的代码为

这里,slave把自己的slave_id,IP,端口,用户名提交给Master,用于注册自己到Master上去。

  • request_dump

request_dump的核心代码如下:

这里会根据GTID来进行判断,如果是GTID模式,那么把本地执行的GTID集合及其他相关信息传给master;如果不是GTID模式,那么就把master log file和Pos传给主库。主库如何根据这些信息来发送binlog的event,参考下节。

  • read_event

read_event调用了cli_safe_read(),cli_safe_read()调用了my_net_read(),等待主库将binlog数据发过来

也就是说,read_event被动的从网络中接受主库发过来的信息。

2. master 如何处理slave的 binlog 请求

MySQL处理各种命令的核心函数为:sql/sql_parse.cc:dispatch_command

该函数的核心代码如下:

该函数会根据用户的请求来确定做什么事情,

  • COM_REGISTER_SLAVE则调用register_slave(thd, (uchar*)packet, packet_length)注册slave
  • COM_BINLOG_DUMP_GTID 则调用com_binlog_dump_gtid(thd, packet, packet_length);
  • COM_BINLOG_DUMP 则调用com_binlog_dump(thd, packet, packet_length);

我们这里以com_binlog_dump为例介绍master怎么发送binlog event给slave的。

com_binlog_dump核心代码为:

  1. kill_zombie_dump_threads(&slave_uuid);
  2. mysql_binlog_send(thd, thd->strdup(packet + 10), (my_off_t) pos, NULL)

kill_zombie_dump_threads()函数:如果新的server_id相同的slave注册上来,master会移除跟该slave的server_id匹配的的binlog dump线程

com_binlog_dump()会调用mysql_binlog_send()来打开文件,将文件指针挪到指定位置,读取文件,将一个个的event按照事件顺序发给slave。

综上

MySQL复制需要slave先注册到Master,再向Master提交binlog和POS,请求发送binlog。Master接收到请求后,先做一系列验证,打开本地binlog文件,按照内部event的顺序,依序发给slave。

三、sql线程在源码中是怎么读取二进制信息,应用到本地MySQL的

sql线程在5.6引入了db级别的并行,所以有两个入口

handle_slave_worker线程是主要干活的函数,handle_salve_sql函数作为协调器会启动和分配worker线程。

handle_slave_sql函数主要调用了slave_worker_exec_job。

slave_worker_exec_job的主要功能:

  1. job_item= pop_jobs_item(worker, job_item); ev= static_cast<Log_event*>(job_item->data);
  2. error= ev->do_apply_event_worker(worker);

该函数做到事情其实就是 从handle_salve_sql()获得具体的event(ev),然后调用ev->do_apply_event_worker(worker),利用c++的多态特性,调用真正的event的do_apply_event虚函数,以便将不同的event的操作在本地做一遍。

这里需要大家回顾一下event的概念了,event是binlog的最小单元,所有的event的父类是Log_event(抽象基类),它定义了一系列虚函数,其中就包括我们这里调用的函数:

这里举一个insert语句对应的的Write_rows_log_event例子,简单说明一下数据是怎么应用到本地MySQL的。

Write_rows_log_event,Update_rows_log_event和Delete_rows_log_event的do_apply_event都是调用的它的基类Rows_log_event的do_apply_event。

Rows_log_event的do_apply_event主要功能如下:

  1. m_table= const_cast <relay_log_info* style=”-webkit-print-color-adjust: exact;”> (rli)->m_table_map.get_table(m_table_id);
  2. error= (this->*do_apply_row_ptr)(rli);

get_table()先从table map中获得对应的table的信息,然后调用do_apply_row_ptr函数指针指向的函数来将event对应操作应用到本地MySQL。

do_apply_row_ptr函数指针可能指向以下几种不同的函数:

  • do_hash_scan_and_update
  • do_index_scan_and_update
  • do_table_scan_and_update
  • do_apply_row

Write_rows_log_event是insert,不用查找数据,所以它调用的是do_apply_row。

do_apply_row主要的功能就是调用了do_exec_row ….汗

do_exec_row是Write_rows_log_event自己实现的,它的主要功能是调用了 write_row ….汗

write_row也是Write_rows_log_event自己实现的,它的主要功能是:m_table->file->ha_start_bulk_insert(estimated_rows);也就是说,它直接把这一行数据交给了存储引擎,让存储引擎把数据给插进去。

四、binlog_format=ROW 格式下,MySQL是怎么用二进制保存各种不同的数据类型的

在sql/log_event.cc:log_event_print_value()函数中详细描述了MySQL的各种数据类型的二进制表现形式,摘录如下:

这里有几个比较有意思的地方:

  1. MYSQL_TYPE_STRING 类型,它的length占用的字节数是不固定的。如果string长度不到大于255,则需要占用2个字节,所以,MySQL在定义String类型的字段时,255是一个坎,如果字段不可能超过255个字节,不建议定义长度的时候超过255,否则MySQL存储数据时会白白浪费一个字节。
  2. MYSQL_TYPE_DATETIME类型。它存储的格式就是把年-月-日 时:分:秒按顺序存储下来的,比如:2015-10-10 22:45:55存储下来就存储为20151010224545。这种存储格式比较浪费,所以字节数相比timestamp占用的也比较多。

mysql服务器raid 0,raid 1+0 stripe size划分策略

        之前看到一篇讲raid 0划分条带大小的文章,对应的联想到在MySQL使用的场景下可以怎么划分条带的问题,特别做了一点分析。因为raid 1+0和raid 0只是多了一个镜像,对条带大小划分没有影响,所以后面只讨论raid 0的条带大小划分。

                   

        没有一个条带大小可以适合所有场景。比如上图是对不同条带大小划分的两个图。左边的条带大小为4KB,右边的条带大小为64KB。现在需要分配空间给四个不同大小的文件,分别为4KB,20KB,100KB和500KB。分别用红色,蓝色,绿色和品红来表示的话,在条带为4K和64K的划分下,表示如上图。

        可以看到,如果请求的文件相对比较小的时候(4KB,20KB),数据只会分布到部分磁盘上;如果足够大,那么就会分布到所有的磁盘上(500KB)。以20KB文件为例,在4KB条带的情况下,数据被分布到四块磁盘,所有的4块磁盘可以同时提供读写,而在64KB条带的情况下,20KB占用不到一个条带大小,只能使用一块磁盘的IO。当然,如果20KB的文件较多的话,数据也会分布到各个条带中去,并发操作也能充分利用到所有的四块磁盘。再看看500KB的情况,在4KB条带的情况下需要分布到125个条带中去,而如果是64K的,只需要8个条带就够了。上图中文件没有进行修改,看上去都是连续的,文件修改以后,4K条带的文件数据会打散得很多,导致随机IO非常多,读出文件的代价非常大;而如果采用64KB的条带大小,问题就小的多。(这里很大一部分跟具体采用的文件系统分配,修改策略相关,就不深入讨论了)。可以大致得出一个结论,在并发比较高的情况下,由于有很多小的读写操作,那么最好使用大一点的条带大小;如果文件数目比较少,但是文件比较大的,可以选择稍微小一点的条带,充分把多块磁盘的性能发挥出来。当然,具体调整到多大,多小,需要根据你的应用来做适当调整。而具体到数据库:对于oltp的数据库,条带不能太小,一个页面IO最好据在一个条带深度内,这样可以减少IO跨盘的磁盘竞争,对于olap,由于并发不是问题,需要的是吞吐量,所以数据最好跨盘,IO粒度也较大,可以充分发挥多盘的IO能力

        那么,对于MySQL来说应该怎么划分条带大小列?

        首先,InnoDB页大小一般是16K,在percona下可以设置页大小,一般也调整为8K,设置太小的话,一页内包含的数据太少,B-tree深度太深的话影响性能。因为InnoDB是按照页来组织的,条带的大小必须大于页的大小,并且是页大小的整数倍。对于16K来说,也就是16K,32K,48K,64K…这样一个页不用到多个磁盘中去读取;一个页在多个磁盘上,部分写成功,部分写失败的问题也不存在了。

        其次,MySQL预读时,都是按照64个页来预读的,对应的16K的页,就是1M大小,对应8K的页就是512K。这个预读的数据最好能够正好分布在所有的磁盘上,这样对于预读这种大IO能够充分调用起所有的磁盘性能。上图中是4块盘,那么16K的页条带大小应该就是:16K*64/4=256K。如果是raid 1+0,10块盘,由于做了镜像,所以可以认为是5块盘。对应的就是:16K*64/5=102.4K。取整以后为128K。

        对应的MySQL strip size大小的公式为:页大小*64/raid0磁盘个数

bonding切换网口

今天接到一个任务,需要把一批机器的bonding切换到另外一边去,包括linux和solaris的机器。
最后在linux平台上用ifenslave
和solaris平台的if_mpadm
两个工具解决了这个问题

这两个工具都是用于控制和管理网卡bonding的工具,非常方便。
ifenslave可以创建bond device;可以将网口attach进bond device;可以将网口提出bond device;可以将bond的目前active网口切换到另外一个活动的网口上。
cat /proc/net/bonding/bond0
可以查看bond0目前的网口

比如
ifenslave -d bond0 eth2
会将eth2从bond0中踢出去。
ifenslave bond0 eth2
会将eth2加入bond0
而我需要的功能:
ifenslave -c bond0 eth2
会将bond0的活动网口切换到eth2上。

而solaris的平台上,if_mpadm也有类似的功能
if_mpadm -d interface_name
用于撤销(detach or off-line )这个网口,这样另外一个网口就会接管这个bond0
if_mpadm -r interface_name
将(Reattach or undo)恢复这块网口的状态。
在solaris上可以用ifconfig -a查看网口和bond的信息

may your successs

非常规change master

flashcache_load resource busy问题

使用fusion io和flashcache的时候遇到过两次
device-mapper: reload ioctl failed: Device or resource busy
Command failed
的异常。

第一次犯的错误是因为
flashcache_load mysql_data_cache /dev/fioa /dev/sdc1
前/dev/sdc1已经mount起来了。flashcache_load无法在已经mount的文件系统上再做cache。
解决的办法:
umount /dev/sdc1
然后按照正确的方法load起来。
正确的做法是对/dev/sdc分区,建立xfs(或者其他ext4,ext3)文件系统,然后利用flashcache_load将ssd设备和文件系统映射起来。
这样就会出现/dev/mapper/mysql_data_cache,将他用xfs(ext3,ext4)的方式mount起来。

第二次犯的错误是:
flashcache还在用,/dev/mapper/mysql_data_cache已经mount好了,把fusion-io的内核模块给卸载掉了。
这个时候flashcache_load会报错,/dev/mapper/mysql_data_cache也没有了,flashcache_create显示:
#flashcache_create mysql_data_cache /dev/fioa /dev/sdc1
cachedev mysql_data_cache, ssd_devname /dev/fioa, disk_devname /dev/sdc1
block_size 8, cache_size 0
flashcache_create: Valid Flashcache already exists on /dev/fioa
flashcache_create: Use flashcache_destroy first and then create again /dev/fioa
dmsetup显示:
#dmsetup table
mysql_data_cache:
解决方案:
dmsetup remove mysql_data_cache
flashcache_load mysql_data_cache /dev/fioa /dev/sdc1
mount -o defaults,rw,noatime,nodiratime,noikeep,nobarrier,allocsize=512M,attr2,largeio,inode64,swalloc /dev/mapper/mysql_data_cache /data2
使用最基本的dmsetup remove来清理mysql_data_cache,然后就可以flashcache_load了。
正常情况下,你最好先flashcache_destroy,然后再来操作fusion io,跟你建立的顺序相反

may your success

MySQL机器配置标准

最近我们部门在整理MySQL的配置标准。主要包括:
一、MySQL使用percona需要新增和调整的参数
二、使用了fusion io和flashcache后,对linux操作系统的配置和内核参数配置
三、由于使用了两个网卡,raid卡和drac卡等相关硬件也需要确认配置
详细信息请参考http://www.hellodb.net/http://www.penglixun.com/的相关文章,敬请期待

Mysql配置:

amysql版本:

percona-custom-5.1.57-12.8 采用icc编译。

 

bmysql配置文件新增:

my.cnf在原有的增加percona,xtradb相关配置

# New

innodb_support_xa = OFF

transaction_isolation = READ-COMMITTED

# innodb plugin

innodb_read_io_threads = 1

innodb_write_io_threads = 16

innodb_io_capacity = 40000

innodb_file_format = barracuda

innodb_file_format_check = ON

innodb_strict_mode = 1

# Percona

innodb_page_size = 4K |4k ssd or 8k sas |16k 大字段,压缩表或者全表扫描应用。

innodb_extra_rsegments = 32 (根据并发情况可调整至64)

innodb_use_purge_thread = 8

innodb_stats_update_need_lock = 0

innodb_fast_checksum = 1

# percona For SSD

innodb_adaptive_checkpoint = 3

innodb_flush_neighbor_pages = 0

innodb_adaptive_flushing = false

 

# Hander Socket

#loose_handlersocket_port = 9998

#loose_handlersocket_port_wr = 9999

#loose_handlersocket_threads = 1

#loose_handlersocket_threads_wr = 1

#loose_handlersocket_readsize = 1M

#loose_handlersocket_rcvbuf = 4M

#loose_handlersocket_sndbuf = 4M

#open_files_limit = 65535

 

c、报警和状态监控增加:无

 

 

linux操作系配置:

杂项

asys 文件系统设置

echo ’16’ > /sys/block/sdb/queue/read_ahead_kb

echo ‘512’ > /sys/block/sdb/queue/nr_requests

echo ‘deadline’ > /sys/block/sdb/queue/scheduler

echo ’16’ > /sys/block/sdc/queue/read_ahead_kb

echo ‘512’ > /sys/block/sdc/queue/nr_requests

echo ‘deadline’ > /sys/block/sdc/queue/scheduler

Fusion io attach上来就是noop,其他参数不修改。

rc.local添加开机自动设置。

 

bulimit限制

打开文件限制。open file limit。目前是10240

max locked memory限制。Unlimited

 

c、大页使用以及内存swap

使用大页的系统,为连接和操作系统预留8G以上。

sysctl.conf增加swappness=0

 

d、报警和状态监控增加:无

 

xfs配置:

amkfs操作

mkfs.xfs -f -i size=512,attr=2 -l lazy-count=1 -d su=1M,sw=2 -L /data1 /dev/sdb1

mkfs.xfs -f -i size=512,attr=2 -l lazy-count=1 -d su=1M,sw=10 -L /data2 /dev/sdc1

不采用flashcache的机器su采用raid 条带大小一般为64k.

采用flashcachesu使用raid卡条带大小(1M)sw采用读的时候磁盘数(比如10块盘,raid 1+0则为10raid5则为9)

 

bmount文件系统

mount -o defaults,rw,noatime,nodiratime,noikeep,nobarrier,allocsize=512M,attr2,largeio,inode64,swalloc LABEL=/redo /redo

mount -o defaults,rw,noatime,nodiratime,noikeep,nobarrier,allocsize=8M,attr2,largeio,inode64,swalloc LABEL=/ibddata /ibddata

/redo中存放:binloginnodb_loginnodb_tslogsockrelaylogslowlog

/ibddata中存放数据文件:mydatatmpdir

mysql的主文件目录/data/mysqldata 采用链接的方式链接到/redo/ibddata目录的各个子目录。

 

csysctl配置

xfs sysctl参数采用默认值,下面列出目前的xfs参数列表及默认值

#sysctl fs.xfs

fs.xfs.stats_clear = 0

fs.xfs.filestream_centisecs = 3000

fs.xfs.inherit_nodefrag = 1

fs.xfs.rotorstep = 1

fs.xfs.inherit_nosymlinks = 0

fs.xfs.age_buffer_centisecs = 1500

fs.xfs.xfsbufd_centisecs = 100

fs.xfs.inherit_noatime = 1

fs.xfs.inherit_nodump = 1

fs.xfs.inherit_sync = 1

fs.xfs.xfssyncd_centisecs = 3000

fs.xfs.error_level = 3

fs.xfs.panic_mask = 0

fs.xfs.irix_symlink_mode = 0

fs.xfs.irix_sgid_inherit = 0

fs.xfs.restrict_chown = 1

 

d、报警和状态监控增加:无

 

flashcache 配置

a、创建cache以及开机载入cache

第一次创建:flashcache_create mysql_data_cache /dev/fioa /dev/sdc1

开机重启时载入:flashcache_load mysql_data_cache /dev/fioa /dev/sdc1

blocksize设置为4k,为默认值。该值采用和perconapage_size一致大小

 

bsysctl配置:

需要修改的四个参数:

dev.flashcache.fast_remove = 1

dev.flashcache.reclaim_policy = 1

dev.flashcache.dirty_thresh_pct = 90

dev.flashcache.cache_all = 1

这些参数直接在/etc/sysctl.conf中修改。

 

下面列出flashcache所有的sysctl参数:

#sysctl dev.flashcache

dev.flashcache.cache_all = 0

dev.flashcache.fast_remove = 1

dev.flashcache.reclaim_policy = 0

dev.flashcache.pid_expiry_secs = 60

dev.flashcache.max_pids = 100

dev.flashcache.do_pid_expiry = 0

dev.flashcache.max_clean_ios_set = 2

dev.flashcache.max_clean_ios_total = 4

dev.flashcache.dirty_thresh_pct = 90

 

以下三个是用于控制flashcache的命令,可以利用这三个参数

dev.flashcache.stop_sync = 0

dev.flashcache.do_sync = 0

dev.flashcache.zero_stats = 0

 

c、报警和状态监控:

命令:

dmsetup status mysql_data_cache

性能监控状态值为:

read hit percent(99) write hit percent(51) dirty write hit percent(44)

 

命令:

dmsetup table mysql_data_cache

性能监控状态值为:

cache percent(98) dirty percent(88)

上面五个百分比在一张图中展示。

 

fusion io 配置

a、内核参数调整:

use_workqueue=0

disable-msi=0

use_large_pcie_rx_buffer=1

其他内核模块参数值采用默认。

这些内核参数直接通过在/etc/modprobe.d/iomemory-vsl.conf配置中新增:

options iomemory-vsl use_workqueue=0

options iomemory-vsl disable-msi=0

options iomemory-vsl use_large_pcie_rx_buffer=1

来添加,文件中其他参数不予调整

 

列出flashcache所有内核参数如下:

parm: enable_ecc:int

parm: enable_two_plane:int

parm: disable_msi:int

parm: bypass_ecc:int

parm: force_soft_ecc:int

parm: bypass_whitening:int

parm: dont_whiten:int

parm: force_sw_read_completions:int

parm: ecc_correction_target_threshold:int

parm: ecc_correction_per_pad_retire:int

parm: ecc_correction_retire_threshold:int

parm: preallocate_memory:Cards for which to preallocate memory

(card <serial> serial number required) (array of charp)

parm: preallocate_mb:int

parm: expected_io_size:int

parm: iodrive_load_midprom:int

parm: iodrive_load_eb_map:int

parm: iodrive_scan_nv_data:int

parm: tcmd0:int

parm: tcmd1:int

parm: tread0:int

parm: tread1:int

parm: twrite0:int

parm: twrite1:int

parm: taddr0:int

parm: taddr1:int

parm: tintr_hw_wait:int

parm: iodrive_tread_hw_wait:int

parm: iodrive_tread_hw_wait_mlc:int

parm: iodrive_tstat_hw_wait:int

parm: iodrive_tstat_hw_wait_mlc:int

parm: iodrive_dma_delay:int

parm: use_large_pcie_rx_buffer:int

parm: use_workqueue:int

parm: default_gc_low_water:int

parm: default_gc_high_water:int

parm: always_rebuild_md:int

parm: auto_attach:int

parm: auto_attach_cache:int

parm: parallel_attach:int

parm: disable_groomer:int

parm: groomer_backoff:int

parm: use_new_io_sched:int

parm: max_md_blocks_per_device:int

parm: strict_sync:int

parm: use_command_timeouts:int

parm: fio_dont_init:int

parm: max_requests:int

parm: reduced_write_threshold:int

parm: capacity_warning_threshold:int

parm: read_only_threshold:int

parm: iodrive_read_retire_threshold:int

parm: disable_rle:int

parm: force_minimal_mode:int

parm: early_oom_threshold:int

parm: flashback_mode:int

parm: flashback_warning_as_failure:int

parm: fio_dev_wait_timeout_secs:int

parm: fio_dev_optimal_blk_size:int

parm: exclude_devices:PCI addresses of devices to exclude during initialization

(full <domain>:<bus>:<slot>.<func> address required) (array of charp)

parm: include_devices:Only initialize devices with these PCI addresses

(full <domain>:<bus>:<slot>.<func> address required) (precedence over exclude_devices) (array of charp)

parm: thermal_throttle_disable:int

parm: compaction_timeout_ms:int

parm: persistent_discard:int

parm: debug_DBGS_DIGEST:uint

parm: debug_DBGS_DMA:uint

parm: debug_DBGS_ECC:uint

parm: debug_DBGS_GENERAL:uint

parm: debug_DBGS_GROOM:uint

parm: debug_DBGS_INJECT:uint

parm: debug_DBGS_LOG_FILE:uint

parm: debug_DBGS_LRBTREE:uint

parm: debug_DBGS_MEDIA_ERROR:uint

parm: debug_DBGS_METADATA:uint

parm: debug_DBGS_PCIE:uint

parm: debug_DBGS_PTRIM:uint

parm: debug_DBGS_REQUEST:uint

parm: debug_DBGS_SHOW_INJECT:uint

parm: debug_FIND_BUG_DA:uint

parm: debug_FIO_PRINT_DANGLING:uint

parm: debug_FIO_PRINT_DIGEST:uint

parm: debug_FIO_PRINT_OBJECT:uint

parm: debug_PRINT_APPEND_FAILURES:uint

parm: debug_PRINT_APPEND_POINT:uint

parm: debug_PRINT_DEPACKETIZER:uint

parm: debug_PRINT_DMA:uint

parm: debug_PRINT_DMA_READ:uint

parm: debug_PRINT_DMA_WRITE:uint

parm: debug_PRINT_ECC_READ:uint

parm: debug_PRINT_ECC_WRITE:uint

parm: debug_PRINT_GROOM_RANGES:uint

parm: debug_PRINT_GROOM_SCAN:uint

parm: debug_PRINT_IDLE_GROOM:uint

parm: debug_PRINT_LEB_OPERATIONS:uint

parm: debug_PRINT_NAND_READ:uint

parm: debug_PRINT_NAND_READ_DETAILS:uint

parm: debug_PRINT_NAND_WRITE:uint

parm: debug_PRINT_PACKETIZER:uint

parm: debug_PRINT_PARITY_OPERATIONS:uint

parm: debug_PRINT_PROGRESS:uint

parm: debug_PRINT_REATTACH:uint

parm: debug_PRINT_REQUESTS:uint

parm: debug_PRINT_REQUEST_LIST:uint

parm: debug_PRINT_RESOURCES:uint

parm: debug_PRINT_SCAN:uint

parm: debug_PRINT_SCAN_ENTRIES:uint

 

b、报警和状态监控:

命令:

fio-status -fk -an /dev/fct0

报警监控:

media_status=Healthy。非healthy报警

 

性能监控:

logical_written_bytes=2664888862208

logical_read_bytes=171877629608448

physical_written_bytes=27684857382680

physical_read_bytes=223401928291768

监控每隔一段时间的变化量而不是这个总量。

 

命令:

fio-get-erase-count -s /dev/fct0

性能监控:

Max: 149

Avg: 79.00

监控活动的block刷写的最大次数以及平均刷写次数

 

fio-get-erase-count -b -s /dev/fct0

Total blocks: 29

监控坏块的个数。

 

硬件相配置

网卡配置:

a、网卡绑定和IP分配

两块网卡,两两交叉配置bond

机器上有几个MySQL实例配置几个IP。各个IP在两个bond0上平均分配

另外增加一个专门的主机监控IP

 

b、网卡中断

网卡中断不绑定到CPU上。

 

c、报警和状态监控:

主机监控IP主要用来做mysql_host主机监控

各个实例IP监控用来监控数据库状态。

 

Numactl配置:

a、单机单实例关闭numa。在内核中直接关闭

多实例情况下,numa内存分配采用bind

采用在my.cnf中的[mysqld_safe]组中添加

mysqld=mysqld_using_numactl

来使用多实例MySQL绑定CPU的目的。

这里列出numa可能的配置选项:

default bind interleave preferred

 

b、增加的报警和状态监控:无

 

 

raid配置:

a、条带大小

raid配置界面,提交装机申请的时候指定,

flashcache设置条带设置为1MSAS盘采用默认64K

 

bLSI raid卡设置

/opt/MegaRAID/MegaCli/MegaCli -LDSetProp -CachedBadBBU -Lall -aALL

/opt/MegaRAID/MegaCli/MegaCli -LDSetProp -DisDskCache -Lall -aALL

/opt/MegaRAID/MegaCli/MegaCli -LDSetProp -NORA -Lall -aALL

/opt/MegaRAID/MegaCli/MegaCli -LDSetProp -WB -Lall -aALL

/opt/MegaRAID/MegaCli/MegaCli -LDSetProp -Direct -Lall -aALL

设置电池断电的时候仍然使用cache;不使用磁盘cache;不进行预读;设置为write back;设置为direct

(hp的机器暂时不管)

增加报警和状态监控:无

 

drac卡配置:

运行local_hw_oob_init.sh脚本,使得机器可以通过ipmi连接屏幕并通过ipmitool工具重启。

报警和状态监控:无

 

linux内核模

/etc/sysconfig/modules新增脚本:

fio.modules flashcache.modules xfs.modules

使得xfs,iomemory-vsl,flashcache开机自动载入

 

附:

block size设置规则:

mySQLraid卡,目前我们需要设置:

aperconapage size(ssd机器为4k , sas则设为8k ,大字段,压缩表或者全表扫描应用则设置为16k)

bflash cacheflashcache_create创建cache时的 block size(默认为4k)

cfusion iofio-format block size(默认不使用fio-format重新格式化fusion io)

dxfssu条带大小(xfs建议自己指定su条带大小,默认值一般不好)

eraid卡条带大小(默认值64K)

 

block size的相互关系如下:

1percona page size根据机器类型和应用类型来设置。

2flashcache_createblock size指定为percona page size一样的大小

3、一般情况下不使用fio-format重新格式化fusion io

4raid卡条带大小flashcache机器设置条带设置为1M,如果是SAS盘采用默认64K

5xfssu条带大小跟raid卡条带大小一样,并且应该为percona page size的整数倍。sw采用读的时候磁盘数(比如10块盘,raid 1+0则为10raid5则为9)

 

 

 


may your success

fusion io使用入门

fuison io使用PCI插槽,大大缩短了到CPU和内存的路径,使得io访问效率大大提高。
这篇文档简单介绍
1、fusion io文档工具的下载
2、fusion io内核模块(驱动)的载入
3、fusion io工具的简介

一、fusion io文档工具的下载
fusion io的文档可以直接在 http://support.fusionio.com/ 注册用户并下载。
登录以后选择产品名称,产品版本,使用的操作系统。这里我们选择的是iodrive,r2.3.1,linux_rhel-5。
选择完成以后,可以有6种下载类:
1、文档:专门下载fusion io的相关文档。里面有fusion io卡的硬件安装手册,User guide等等。
2、驱动:你可以在这里下载fusion io的驱动程序。包括各个不同内核的驱动版本。
如果你的内核是定制过的,请自行下载源码包并重新编译
3、工具:这里包含了 fusion io的各个相关工具集。
4、iomanager:这个是针对fusion io的单机图形化管理界面。
如果你的机器不允许运行图形界面,这个你就不用关注了。
5、firmware:这里是fusion io最新的firmware。
fusion io号称升级firmware不仅能够修复bug还能够提升性能。所以尽量升级到最新的firmware吧。
6、SDK:这个是fuison io的开发包。
如果你不对fusion io做一些开发工作,这个你也无需关注。

二、fusion io内核模块(驱动)的载入
fusion io的内核模块下载以后,直接安装增加/lib/modules/2.6.18-164.el5/extra/fio/iomemory-vsl.ko文件。
直接用
modprobe -v iomemory-vsl
就可以载入对应的fusion io模块。
万一你的内核版本是定制过的,或者从网站上无法下载。请参考 http://hatemysql.com/2011/06/20/%E6%90%AD%E5%BB%BAxfs%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F/ 中的模块编译。
iomemory-vsl默认是利用udevd开机自动加载的,具体的配置请参考user guide.

三、fusion io工具的简介。
fusion io的工具包括:
fio-attach fio-beacon.py fio-detach.py fio-format.py fio-ioctl-lock fio-snmp-agentx fio-su-to-root
fio-attach.py fio-bugreport fio-dump-mid fio-get-erase-count fio-pci-check fio-status fio-update-iodrive
fio-beacon fio-detach fio-format fio-govcfg fio-read-lebmap fio-status.py fio-write-lebmap

1、fio-attach 。
fusion io因为直接插在PCI插槽上的,是PCI设备(/dev/fct0),而我们使用它的时候希望是作为块设备(当作磁盘一样来使用),那么我们就需要把它attach为磁盘设备/dev/fioa。
这个工具就是这个用途的。
fio-attach /dev/fct0 可以直接把第一个fusion io设备挂载为 /dev/fioa磁盘设备。这样我们就可以很方便的使用/dev/fioa作为裸盘或者flashcache的缓存了。

2、fio-detach
和fio-attach相反。将块设备detach下来。、
fio-detach /dev/fct0
fusion io卡默认会自动attach。如果需要修改这个行为可以参考user guide,修改/etc/modprobe.d/iomemory-vsl.conf文件中的options iomemory-vsl auto_attach=0

3、fio-beacon
这个工具用于点亮fusion io上的三个LED灯。用于定位fusion io卡。这个工具需要先detach fusion io卡

4、fio-read-lebmap
用于读取fusion io的event log。它会导出一个xml文件,硬件坏块等相关信息都会记录到这个日志中。

5、fio-write-lebmap
清除或者写fusion io的event log

6、fio-bugreport
收集fusion io和机器的相关信息,用于提交bug。可以参考它收集的信息做一些报警和性能监控。

7、fio-dump-mid
dump fusion io卡的一些硬件信息
#fio-dump-mid /dev/fct0
[board]
date = 20110406
manufacturer = 004
name = Low-Profile ioDIMM Adapter
part_number = 00119200008
fpga_id = 0
id = 36406
#serial_number = 000000008e360132dc46001c6b642000
factory_firmware_version = 0

[product]
name = Fusion-io ioDrive 320GB
part_number = FS1-004-320-CS

8、fio-format
低格fusion io卡,会丢失掉fusion io卡上的信息。fusion io默认会保留20%的空间以备存储介质损坏,你如果想把保留的空间也用上,可以用这个。
低格fio-format你也可以用来指定fusion io的块大小。

9、 fio-get-erase-count
该工具用于获得fusion block刷写的量。因为SLC或者MLC设备寿命跟刷写的次数有关,这个可以用于观察fusion io的健康程度。
fio-get-erase-count -b /dev/fioa
可以获得fusion的坏块个数和坏块号。
fio-get-erase-count /dev/fioa
可以获得没坏的所有fusion io block的刷写数。
fio-get-erase-count -s /dev/fioa
可以获得所有fusion io block的统计信息。
这里fusion io block跟具体的fio-format的块大小无关。我们320G的 fusion io分了4093个块,每个块大概100M左右。具体这个block代表什么还真不知道。

10、fio-govcfg
#fio-govcfg /dev/fct0
Opening device ‘/dev/fct0’
Lifespan extender functionality is NOT supported on this device.
用于Lifespan extender functionality。我们的卡不支持。

11、fio-ioctl-lock
查询,锁住或者解锁 /etc/fct0 的ioctl锁。

12、fio-pci-check
检查pci bus tree的状态,特别是fusion io的。它会重设状态值,如果上次报错,那么第二次就不会报错了。
fio-pci-check -vvf
可以生成详细的bus tree信息。
目前还不知道怎么把它用于报警监控

13、fio-snmp-agentx
实现了fusion io SNMP的sub-agent。它通过agentx协议连接SNMP的master agent。

14、fio-su-to-root
su到root或者其他用户,来执行命令。

15、fio-update-iodrive
更新fusion io的固件版本(firmware)。
下载好fusion io的最新firmware以后,rpm安装会在/usr/share/fio/firmware/下产生iodrive_#.fff的firmware文件。
利用
fio-update-iodrive /usr/share/fio/firmware/iodrive_#.fff
就可以更新固件版本了

16、fio-status
这个命令比较重要,用于生成fusion io的状态信息。
fio-status -an
用于生成fusion io的详细信息
fio-status -fk -an
生成的fio-status -an format成了
physical_written_bytes=27684857382680
的形式。
fio-status的输出很多,比较重要的有
Media status: Healthy; Reserves: 100.00%, warn at 10.00%
Media status状态可能值为healthy, nearing wearout, write-reduced or read-only。其实只要不是healthy就可以报警了。
Logical bytes written : 2,665,512,646,144
Logical bytes read : 171,877,631,506,944
Physical bytes written: 30,415,610,387,704
Physical bytes read : 226,129,092,711,168
显示了fusion io逻辑上和物理上实际读写的量。

附fio-status的输出:
#fio-status -an

Found 1 ioDrive in this system
Fusion-io driver version: 2.3.1 build 123

Adapter: ioDrive
Fusion-io ioDrive 320GB, Product Number:FS1-004-320-CS SN:36406
Low-Profile ioDIMM Adapter, PN:00119200008, Mfr:004, Date:20110406
External Power: NOT connected
Powerloss protection: available
PCIE Bus voltage: avg 12.15V, min 12.11V, max 12.17V
PCIE Bus current: avg 0.39A, max 1.31A
PCIE Bus power: avg 4.77W, max 15.85W
PCIE Power limit threshold: 24.75W
PCIE slot available power: 25.00W
Sufficient power available: Unknown
PCIE negotiated link: 4 lanes at 2.50 Gbits/sec each, 1000 MBytes/sec total
Connected ioDimm module:
fct0: Fusion-io ioDrive 320GB, Product Number:FS1-004-320-CS SN:28212

fct0 Attached as ‘fioa’ (block device)
Fusion-io ioDrive 320GB, Product Number:FS1-004-320-CS SN:28212
ioDIMM3 320GB MLC, PN:00279200404, Mfr:004, Date:20110406
Powerloss protection: protected
PCI:04:00.0, Slot Number:2
Vendor:1aed, Device:1005, Sub vendor:1aed, Sub device:1010
Firmware v5.0.7, rev 101971
320.00 GBytes block device size, 396 GBytes physical device size
Format: block, v300, 625,001,920 sectors, 512 bytes per sector
4096 blocks, 512 pages, 189056 bytes/page (25 pads, 2 planes, 4 banks)
Error correction: 11 bits per 240 bytes, expect 4 bits
NAND Mfr: Samsung
NAND Cell Type: MLC
Device ID: 0xd7
Page Size (bytes): 4096
Block Size (bytes): 524,288
Plane Size (bytes): 8,589,934,592
Spare bytes per page: 128
FPGA ID:0 Format UID:000000006e340132dc460042910a5000
PCIE slot available power: 25.00W
Sufficient power available: Unknown
PCIE negotiated link: 4 lanes at 2.50 Gbits/sec each, 1000 MBytes/sec total
Internal temperature: 46.8 degC, max 48.7 degC
Board temperature: 40 degC
Internal voltage: avg 1.008V, max 1.008V
Aux voltage: avg 2.476V, max 2.476V
Media status: Healthy; Reserves: 100.00%, warn at 10.00%
Thresholds: write-reduced: 96.00%, read-only: 94.00%
Lifetime data volumes:
Logical bytes written : 2,665,512,646,144
Logical bytes read : 171,877,631,506,944
Physical bytes written: 30,415,610,387,704
Physical bytes read : 226,129,092,711,168
RAM usage:
Current: 406,177,792 bytes
Peak : 406,665,216 bytes
Persistent Driver Settings:
dual_plane = 1

xfs文件系统入门

xfs是一个优秀的文件系统。
我们这篇文章专门介绍怎么让自己的磁盘分区使用xfs文件系统。
简单涉及三个方面:
1、xfs内核模块的编译和载入。
2、mkfs.xfs在磁盘分区上构建xfs文件系统
3、将构建好的xfs文件系统mount到系统中来。
4、开机自动load xfs模块。

1、xfs内核模块载入
xfs在centos 5.4(内核2.6.18-164.el5)之前是需要自己编译,或者下载对应内核的xfs模块的。还好,我们使用的系统是5.4,支持xfs模块。
也就是说,我们只需要
modprobe -v xfs
就可以载入xfs内核模块。
万一有问题,有可能是你之前modprobe引入了其他的xfs,你可以考虑
depmod -a
试一下,然后再modprobe -v xfs。

下面的这一段为作者凑字数的,请忽略
那么对于之前的xfs模块,你可能需要自己去下载xfs的内核模块,linux要求内核模块和内核完全匹配,希望你能找到正确的内核模块。
这里提供一个下载地址:http://centos.ustc.edu.cn/centos/5/extras/x86_64/RPMS/kmod-xfs-0.4-2.x86_64.rpm
好吧,万一,你真的找不到,那就自己编译把,先下载源码包:
http://mirrors.ustc.edu.cn/centos/5/extras/SRPMS/xfs-kmod-0.4-2.src.rpm
然后直接用rpmbuild命令来编译:
rpmbuild -D ‘kversion uname -r‘ –rebuild xfs-kmod-0.4-2.src.rpm
正常的来说,应该不会有问题。
这里插一个小插曲,我在centos 5.4机器上编译这个的时候就出现了问题:
In file included from /usr/src/redhat/BUILD/xfs-kmod-0.4/_kmod_build_/xfs.h:20,
from /usr/src/redhat/BUILD/xfs-kmod-0.4/_kmod_build_/quota/xfs_dquot.c:18:
/usr/src/redhat/BUILD/xfs-kmod-0.4/_kmod_build_/linux-2.6/xfs_linux.h:120: error: redefinition of ‘set_buffer_unwritten’
include/linux/buffer_head.h:126: error: previous definition of ‘set_buffer_unwritten’ was here
这里是因为xfs在centos 5.4以后把set_buffer_unwritten的函数定义直接放到include/linux/buffer_head.h里面去了,因为它自己带了xfs,放在哪里它说了算,
当时找到http://bugs.centos.org/view.php?id=3364,他们还判断可能是bug,呵呵,不过下面的这个办法确实可以编译成功,
diff -up linux-2.6/xfs_linux.h.orig xfs-kmod-0.4/xfs/linux-2.6/xfs_linux.h
— linux-2.6/xfs_linux.h.orig 2006-09-20 06:42:06.000000000 +0300
+++ linux-2.6/xfs_linux.h 2009-05-21 11:06:19.000000000 +0300
@@ -117,7 +117,7 @@
* not need to distinguish – we use the BH_Delay flag for both
* delalloc and these ondisk-uninitialised buffers.
*/
-BUFFER_FNS(PrivateStart, unwritten);
+//BUFFER_FNS(PrivateStart, unwritten);

#define restricted_chown xfs_params.restrict_chown.val
#define irix_sgid_inherit xfs_params.sgid_inherit.val
去掉了BUFFER_FNS就忽略了相关定义。

2、mkfs.xfs在磁盘分区上构建xfs文件系统
内核模块载入以后,构建xfs文件系统还需要一些辅助的包。
简单列出如下:
wget http://centos.ustc.edu.cn/centos/5/extras/x86_64/RPMS/xfsdump-2.2.46-1.el5.centos.x86_64.rpm;
xfsdump对xfs文件系统备份和恢复的工具,主要包括/sbin/xfsdump和/sbin/xfsrestore工具。
wget http://centos.ustc.edu.cn/centos/5/extras/x86_64/RPMS/xfsprogs-2.9.4-1.el5.centos.x86_64.rpm;
wget http://centos.ustc.edu.cn/centos/5/extras/x86_64/RPMS/xfsprogs-devel-2.9.4-1.el5.centos.x86_64.rpm;
xfs的管理工具包,包含了很多xfs工具,以xfs_打头的,基本都在这个包里,本段最重要的工具mkfs.xfs就在这个包里
wget http://centos.ustc.edu.cn/centos/5/extras/x86_64/RPMS/dmapi-2.2.8-1.el5.centos.x86_64.rpm;
wget http://centos.ustc.edu.cn/centos/5/extras/x86_64/RPMS/dmapi-devel-2.2.8-1.el5.centos.x86_64.rpm
dmapi是向上层提供数据管理接口的软件包。
上面的两个-devel开发包都可以不安装,
安装好这些rpm包以后,我们就可以对我们的磁盘分区来构建xfs文件系统了。
对了,之前的对磁盘进行分区等相关操作:
parted -s /dev/sdb mklabel gpt
parted — /dev/sdb mkpart primary 1 -1
不在本文介绍范围,却是构建文件系统的必要条件。
好,构建xfs文件系统,正式开始:
mkfs.xfs -f -i size=512,attr=2 -l size=128m,lazy-count=1 -d su=64k,sw=5 -L /data /dev/sdb1
就这么一个命令。你可以指定日志,inode和数据文件,分配组的各个参数。
具体的参数请man mkfs.xfs来查看。比较重要的是数据文件的两个参数:su和sw

3、将构建好的xfs文件系统mount到系统中来。
构建好文件系统以后,我们就可以把它mount上来。
如果你需要每次系统启动的时候就将对应的磁盘分区mount上来,那么你需要修改/etc/fstab,
否则,你只需要执行mount命令就好。
我们这里采用的是/etc/fstab的方法。
LABEL=/data /data xfs defaults,noatime,nodiratime,noikeep,nobarrier,logbufs=8,logbsize=32k,allocsize=512M,attr2,largeio,inode64,swalloc 0 0
这个就是我们在/etc/fstab中的对应项。
LABEL=/data这个是因为我们在mkfs.xfs中使用了-L /data为/dev/sdb1打上了标签。
后面的mount选项比较重要,
具体的选项可以参见:http://www.netmite.com/android/mydroid/kernel/Documentation/filesystems/xfs.txt

4、开机自动load xfs模块。
这里xfs文件系统可以自动载入,但是,xfs内核模块怎么才能设置成每次开机的时候自动启动列。
就不卖关子了,在centos 5的系统中,有一个/etc/sysconfig/modules/文件夹,系统启动的时候,会自动扫描和执行该文件夹下的脚本。
对linux启动时执行些什么东西可以参考:http://linux.vbird.org/linux_basic/0510osloader.php
我们只需要在该目录下模拟原有的脚本编写一个同样的脚本,并且在脚本里写上 modprobe xfs就行了,我的脚本xfs.modules如下:
#cat /etc/sysconfig/modules/xfs.modules
#!/bin/sh
MODULES=”xfs”
[ -f /etc/sysconfig/xfs ] && . /etc/sysconfig/xfs
for i in $MODULES ; do
modprobe $i >/dev/null 2>&1
done
呵呵,不过/etc/sysconfig/xfs文件还没有。

may your success

mount点fail以后影响rpm和check_raid

今天碰到一个比较奇怪的问题。我们的一台机器,突然跑rpm和check_raid会hang死。
另外一个同事跟进以后发现把这个系统中一个已经失效mount点强制umount掉以后就能够恢复。
感觉这个是两个问题啊。

库哥通过strace最终找到了具体的原因。
通过strace可以看到rpm运行的时候会首先检查整个文件系统的挂载点。
由于该挂载点的提供服务者已经下线,所以对应的节点访问会hang住。
也就导致了rpm无法继续运行下去。
目前还不能确认这种问题的影响面有多少。

另外一位大牛旺旺介绍了文件系统IO延时的文章。先记录下来,细细品味
Brendan Gregg 写的关于文件系统IO延时的系列文章,,虽然是基于Solaris系统做的,,对于Linux以及相关的系统也比较有参考意义,,有兴趣的同学可以了解下.
http://dtrace.org/blogs/brendan/2011/05/11/file-system-latency-part-1/
http://dtrace.org/blogs/brendan/2011/05/13/file-system-latency-part-2/
http://dtrace.org/blogs/brendan/2011/05/18/file-system-latency-part-3/
http://dtrace.org/blogs/brendan/2011/05/24/file-system-latency-part-4/

may your success

dell dset工具收集日志以及dell bios升级

上周对最核心的中文站主机进行了bios升级,其中涉及到dell相关日志的收集以及bios升级的办法,这里记录下来,以便以后如果还有类似需要,进行查阅。
首先,dell 的dset工具使用和介绍本身官网上就有:http://support1.ap.dell.com/cn/zh/forum/thread.asp?fid=20&tid=99848&type=email_tool。这个工具可以用来收集系统驱动,服务,网络设置等等,同时又包括CPU,memory, ESM log, BIOS/firmware versions and system health (fan/voltage levels). ,它也收集系统存储信息,比如:RAID卡,硬盘等。运行方式没有找到非交互式的办法,估计只好解压bin包来搞了。运行这个文件以后会在指定的目录或者在用户根目录下产生一个压缩文件。解压文件需要密码,偷偷的告诉你,就是:dell。解压的文件夹里面dsetreport.hta就是一个网页文件,看起来还是比较爽的。
然后:我们DELL R710机器的bios下载地址http://ftp.us.dell.com/bios/PER710_BIOS_LX_2.3.12.BIN
另外找dell的工程师要了几个工具的下载地址和使用说明:
OSMA软件下载(windows版):http://ftp.us.dell.com/sysman/OM-SrvAdmin-Dell-Web-WIN-6.4.0-1266_A00.18.exe
OSMA软件下载(Linux版):http://ftp.us.dell.com/sysman/OM_6.1.0_ManNode_A00.tar.gz
ITA软件下载:http://ftp.us.dell.com/sysman/OM-ITAssistant-Dell-Web-WIN-6.4.0-1266_A00.11.exe
ITA使用说明:http://support1.ap.dell.com/cn/zh/forum/thread.asp?fid=20&tid=163390