地震前兆数据多线程采集与多目标入库应用研究*
2011-11-23张兴国王子影何案华
张兴国 王子影 刘 坚 何案华
(1)中国地震局地壳应力研究所,北京 100085 2)中国地震局地震研究所,武汉430071)
地震前兆数据多线程采集与多目标入库应用研究*
张兴国1)王子影1)刘 坚2)何案华1)
(1)中国地震局地壳应力研究所,北京 100085 2)中国地震局地震研究所,武汉430071)
利用可实例化的智能线程池技术,通过两个线程池分别实现了前兆数据的并行数据采集与数据的多目标入库,可自动实现对最近15天内的数据进行检测与采集,采集仪器的数量由原来的几台、十几台提高到上千台,大大提高了地震前兆数据的采集效率;通过数据的多目标入库,数据由台站到区域中心以及国家台网中心的同步速度也得到很大提高。
多线程;智能线程池;地震前兆;多目标入库;并行数据采集
1 引言
前兆数据的采集主要由台站一级负责,数据采集任务采用后台多线程技术,台站采集的数据定时同步到区域中心,区域中心定时同步到国家中心,再由国家中心同步到各学科中心。数据采集任务实现了一定数量的多线程并行采集,其数据的逐级定时同步机制优点是前兆仪器与各级服务器的负担都较为均衡,缺点是数据采集与入库机制不够灵活,中间任何一级出现问题,数据的采集与入库都会受到影响,有时还需要人工进行干预。
针对上述情况,本文采取地震前兆数据并行处理方案,即采用可实例化的智能线程池技术实现前兆数据的并行采集与数据的多目标入库,由实例化的两个线程池分别处理数据采集与数据入库任务,利用智能线程池的复用技术将并行多线程的数量突破了常规的64个线程限制,采集任务并行处理的仪器数量达上千台,全自动保持对最近15天的数据进行采集,多目标入库并行处理、采集与入库并行处理。该方案部署灵活,可部署在台站、区域或国家中心任一级的普通PC机上,也可多机协调工作。
2 多线程地震前兆数据采集与多目标入库
地震前兆数据采集的对象通常指一个台站或一个区域所属的全部前兆仪器,观测手段多样,所属学科多样,因此一般情况下数据采集软件需要同时对多台仪器进行数据采集。现行的地震前兆运行管理系统同样采用后台多线程技术进行数据采集,数据同步方式采用逐级定时同步。本文提出的地震前兆数据采集与多目标入库方案,是针对以前地震前兆运行系统的不足进行了部分功能的改进,系统部署更加灵活,适用于任何普通PC机;数据采集采用智能线程池技术,具有高效的线程管理技术,突破了常规的多线程数量的限制,使得前兆仪器的并行采集数量得到非常大的提高;数据的多目标入库也大大提高了台站数据到所属区域中心与国家中心的同步速度。
2.1 后台多线程与线程池技术
对于单线程程序,如果直接在UI线程运行一个费时的方法,会引起程序“假死”,对用户来讲,非常不友好。这时就需要通过后台多线程技术来解决,提高界面交互性能,方便用户使用。
后台多线程在c#中的实现方式有两种:一是通过System.Threading.Thread类,创建多个新的线程,并置线程的属性IsBackGround为真;二是通过System.Threading.ThreadPool(线程池)类,将费时任务提交到线程池中,等待运行。第一种方法,在多线程的重复使用中不便于进行控制,可能会导致线程的数量快速增大,影响系统性能。第二种方法,由线程池高效的线程管理机制来处理多任务,实现对线程的统一管理,从而能很好地控制多线程的重用,线程数量可得到有效控制。
2.1.1 CLR线程池
.NET环境有一个内置的CLR线程池,可以利用ThreadPool类中的静态方法使用这个线程池。通过QueueUserWorkItem方法向线程池中添加任务,线程池就会负责在合适的时候执行它们。CLR线程池对线程的最大和最小数量作了限制,对线程创建时间作限制,以避免突发的大量任务消耗太多的资源。
CLR线程池的缺点:
1)不能实例化,只能存在一个线程池;
2)无法设定任务优先级;
3)WaitHandle方法传递的句柄不能超过64个,否则出现异常。
2.1.2 SmartThreadPool智能线程池
SmartThreadPool,智能线程池的特点如下:
1)可创建线程池实例;
2)可动态调整线程池工作线程数量;
3)WorkItem可以返回信息;
4)未执行WorkItem可被取消;
5)WorkItem执行时可使用调用者上下文;
6)调用者可等待多个或全部WorkItem执行结束;
7)WorkItem允许拥有一个执行结束时被执行的PostExecute回调委托;
8)可以向 WorkItem传递一个状态对象,并且会在执行结束时自动调用IDisposable.Dispose();
9)WorkItem异常会传递给调用者;
10)支持WorkItem分组;
11)可挂起线程池或分组;
12)可以设置WorkItem优先级;
13)可以设置线程优先级;
由以上对比分析可看出,利用Thread类实现的多线程,当线程数量较多时,系统创建线程的费用很高,影响系统性能。CLR线程池WaitHandle方法存在64个句柄的限制,即当采集对象的总数超过64个就会弹出异常警告,且只能同时存在一个线程池。综合以上因素我们选择采用SmartThreadPool智能线程池技术。
2.2 多线程前兆数据采集与多目标入库
多线程地震前兆数据采集与多目标入库实现原理:利用SmartThreadPool的实例化特性创建两个线程池实例,分别为数据采集线程池DataGatherPool、数据入库线程池Data2LibPool,DataGatherPool用来实现对多个仪器最近15天数据的全自动采集,Data2LibPool负责对采集文件进行多目标入库,由采集定时器与入库定时器分别控制采集线程池的数据采集与入库线程池的数据入库工作(图1)。
数据采集线程池大小可任意设定,综合考虑各方面因素,线程池的大小以小于50为宜,当采集仪器数量较多时,线程池建立任务序列,等待空闲线程,一旦有空闲线程出现,就会按顺序执行任务队列中的任务,这样通过线程池内线程的复用可实现对大量前兆仪器的数据采集,解决了WaitHandle传递句柄不能超过64个的限制瓶颈。经测试上千台仪器的状态获取只需3~4分钟且运行稳定。
图1 地震前兆数据的多线程采集与入库流程Fig.1 Flow chart of multi-threaded acquisition and storage of earthquake precursor data
数据入库线程池可设为不大于10个线程,每一个文件作为一个对象占用线程池内的一个线程,当所有文件均入库完毕,线程池即处于空闲状态,可以关闭退出,等待下一次任务序列的到来。
2.2.1 多线程的地震前兆数据采集
多线程的地震前兆数据采集相比以前地震前兆运行管理系统所要解决的主要问题一是实现对大量前兆仪器的并行数据采集;二是任何时刻都可实现对最近15天内数据的全自动采集;三是可实现多机协调工作。通过SmartThreadPool的线程重用技术实现了对上千台前兆仪器的全自动并行数据采集,利用线程池的复用实现定时任务。为保证线程池的重用和数据采集的正确性与完整性,采集线程工作流程如图2所示。
多线程采集中的关键技术有如下4个方面:
1)多线程采集中的超时机制
为了保证线程池内的采集线程能够正常退出或发生异常退出,采用两种超时机制,一是socket超时机制,设定socket的发送与接收超时时间,当socket连接异常时靠系统自身的机制来触发异常,强制关闭socket,退出采集线程。Socket接收超时时间根据仪器的采样率自动调整,分钟采样的仪器,socket超时时间设置较小;秒采样的仪器,socket超时设置较长一些。二是数据通信超时机制,所谓数据通信超时就是当采集模块与仪器一直保持连接状态,但在定时时间内没有接收到任何数据,则认为socket异常,强制关闭socket连接,退出采集线程,作为第一种超时机制的补充,确保线程池的正常运转。
图2 地震前兆数据的多线程采集流程Fig.2 Flow chart of multi-threading acquisition of earthquake precursor data
2)多机协调采集状态字的生成策略
采集状态字的生成策略需要考虑多机协调、采集中断等情况,采集状态字以仪器为单位,首先,在本机原始文件路径下统计最近15天已经采集到的数据文件情况,采集到文件记为1,未采集到文件记为0,生成一个0和1组成的15位状态字,称为状态字a。由于数据采集采用即采即写文件的方式,该统计状态字内可能包含由于断电、人为中断等原因产生的不完整数据文件。其次,读取参数服务器内该仪器的采集状态字,包含多机采集的结果,该状态字中为1说明该仪器该日的数据已经采集成功,称为状态字b。再次,读取参数服务器内该仪器的入库状态字,包括多机采集与入库的结果,状态字中为1说明该仪器该日的数据已经成功入库,称为状态字c。最后,将状态字a与状态字b按位相与,即本机已经采集到文件且参数服务器内标记成功采集的为1不再进行采集;本机有文件且参数服务器内标记未成功的为0,有两种原因:一是程序中断导致文件采集未完成,二是文件采集完成,由于程序中断未及时更新参数服务器的采集状态字,需要重新采集;本机无文件而参数服务器内标记采集成功的为0,需要采集;本机无文件且参数服务器内标记采集未成功的为0,需要采集。这样得到一个新的状态字称为状态字d,再将状态字c与状态字d按位进行或运算,即只要标记入库成功的都不需要再采集,未入库且需要采集的全部采集,得到最终需要的采集状态字。
根据计算生成的最终采集状态字,进行判断最近15天内是否需要采集某一天的数据。该状态字以最近15天采集入库状态为判断对象,将单机与多机协调工作融合在一起,保证数据不会漏采,会存在小部分重采现象。
3)非正常文件的处理
为了减轻采集线程的负担,对采集到的文件只进行初步的校验,一是校验文件格式的完整性,完整的采集接收文件都有ack结束标志,通过检查接收文件是否具有ack标志,判定文件是否完整;二是校验文件的大小,通常文件的内容都要大于几十个字节,当接收文件的大小非常小时,也认为该文件不完整。文件的详细校验在入库环节进行,通过初步检验,得到非正常文件,并把该文件移到非正常文件存放路径,以备检查之用。如果在后续的采集中,得到该天正常的采集文件,就会把非正常文件路径下的对应文件删除。
4)原始文件定时清理
采集到的原始数据与仪器工作日志文件先保存到原始数据文件路径下,当采集成功后再复制到入库路径下,供入库单元调用。当仪器数量较多时,原始数据路径下的文件数量很大,生成状态字时文件的检索速度变慢,需要定时清理,每天定时清理该文件夹内的文件,只保留最近15天的原始数据,便于统计本地采集状态字,也便于软件的维护。
2.2.2 地震前兆数据的多目标入库
地震前兆数据的多线程入库可实现数据的多目标入库,利用入库定时器控制定时任务的启动,首先,检测入库路径下有无入库文件,如果有文件存在,把文件作为任务对象添加到入库线程池内。其次,对任务对象进行全面校验,校验文件命名格式、文件内容格式、文件大小、数据大小,如果文件不正常,被移入非正常文件路径下,同时更新采集状态字为未成功。最后,检索该文件的入库目标,将该文件逐个目标进行入库。例如,可同时将该文件的入库目标设为区域中心与国家台网中心,使数据同步速度得到有效提高。入库成功后,更新该文件所属仪器的入库状态字,同时将该文件压缩后移到本机备份数据路径下,作为本机备份保留,同时检测非正常文件路径下是否含有该文件,若有则删除。任一目标数据库未入成功该文件仍保留在入库路径下,等待下次继续入库。入库线程工作流程如图3。
图3 入库线程工作流程Fig.3 Flow chart of warehousing thread work
多线程入库中的关键技术有如下3个方面:
1)多目标入库
通过在参数服务器设置仪器的入库目标,可实现数据的多目标入库,即每台仪器对应多个目标数据库,采集文件可同时存放到多个数据库,实际应用时可根据需要设置仪器的入库目标为区域中心数据库与国家台网中心数据库,这样可由台站一级采集到数据后直接同步到区域中心和国家台网中心,数据的同步更加及时和灵活,能满足数据处理的即时需要。只有当该文件所属仪器的多目标数据库完全入成功,才表示入库完成,文件压缩后保存到备份数据路径下;任何一个目标数据库未入成功,返回的状态均为入库未成功,文件继续存放在入库路径下,等待下次入库调用,直到所有入库目标均入库成功。实际应用中特别注意,入库目标向上选择,禁止向下选择大量的入库目标,导致入库效率下降,失去多目标入库的意义。
2)数据压缩备份
数据入库成功后经过压缩移到备份数据存放路径下,按月存放,便于检索。本地备份数据文件可用于日后数据的重新入库或数据处理的需要,无需再由数据库内获取该数据文件,通过采集入库模块的备份数据提取功能,查找所需的数据文件。
3)备份数据重入库与外部文件入库
通过将备份路径下的压缩备份文件解压缩后导入入库路径,可实现对备份数据的重入库,用于解决数据库损坏以及满足不同数据库的需要。对于通过其它途径下载的数据文件,利用外部文件导入功能,转化为本地入库需要的格式后,即可实现外部文件的多目标入库。
2.3 SmartThreadPool在多线程入库中的应用实例
以数据的多线程入库为例,介绍SmartThread-Pool的应用。
SmartThreadPool在c#中的应用步骤:
1)添加SmartThreadPool.dll引用;
2)程序内添加SmartThreadPool的命名空间引用;
3)实例化SmartThreadPool,同时初始化空闲超时时间与线程大小;
4)定义IWorkItemResult[]大小;
5)添加工作队列到线程池;
6)WaitAll等待线程池空闲;
7)关闭线程池;
SmartThreadPool在数据多目标入库中的实际应用:
SmartThreadPool smartDataLibPool=new Smart-ThreadPool(10* 1000,10,2);
//空闲超时10s,线程超过10s自动销毁,最大线程数10,最小线程数2
int nCountOfFile=FileInfoArray.Length;
//得到入库文件数
IWorkItemResult[] ResultOfDataLib = new IWorkItemResult[nCountOfFile];
//根据处理的对象数定义IWorkItemResult[]
for(int i=0;i<nCountOfFile;i++)
{
ResultOfDataLib[i]=smartDataLibPool.Queue-WorkItem(new WorkItemCallback(DataLibItem-Work),FileInfoArray[i]);
}
//添加任务队列到线程池
SmartThreadPool.WaitAll(ResultOfDataLib);
//等待线程池空闲
smartDataLibPool.Shutdown();
//关闭线程池
其中回调函数DataLibItemWork就是实际应用的数据入库函数,所有的入库操作与处理均由该函数体完成,FileInfoArray[i]为每个入库文件对象。
2.4 SmartThreadPool应用注意事项
1)添加命名空间的引用using Amib.Threading。
2)线程池内的线程由系统托管进行管理,任何一个线程出现死机或阻塞,均会导致线程池长期处于忙状态,线程池不能关闭,从而不能实现线程池的复用,尤其在前兆数据的采集过程中,由于某个原因导致SOCKET阻塞,采集过程不能异常退出,结果导致整个线程池一直处于忙状态。因此在采集程序中要充分考虑到各种因素可能造成的影响,处理好各种可能出现的异常,保证采集过程能够正常退出或异常退出,线程池才能正常连续运转。
3 多线程的地震前兆数据采集与多目标入库技术的应用
3.1 多线程的地震前兆数据采集与多目标入库技术应用
基于多线程的地震前兆数据采集与多目标入库模块的应用较为灵活,可部署在台站、区域中心或国家中心任意一台PC机上,用于台站一级可以实现对台站所属前兆仪器进行全自动的数据采集,其入库目标为台站服务器以及台站所属区域中心与国家中心三个目标;用于区域一级可实现对区域所属前兆仪器进行全自动的数据采集,其入库目标通常为本区域服务器与国家中心服务器两个目标;用于国家中心一级可实现有选择地对某个区域内仪器或某些跨区域仪器进行数据采集,入库目标为国家中心,也可根据需要自设定某些学科的仪器同时入学科中心;若需要进一步提高采集与入库速度,也可利用多机协调工作。总之,对该模块的应用比较灵活,入库目标通常向上发展,数量不能过多,即台站应用时入库目标较多,区域应用时目标减少,按这种趋势部署分配任务;入库目标不能向下发展,通常禁止上级中心运行该模块,同时设定入库目标为所属下级各台站服务器或区域中心服务器这种运行方式,不能体现多目标入库同步速度快的优点。
3.2 多线程的地震前兆数据采集与多目标入库运行情况
经过运行测试,该采集入库模块可实现对上千台前兆仪器进行数据采集,采集仪器的选择方式灵活多样,可按仪器、台站、区域、采样率进行选择;可实现数据的多目标入库,提高了由台站到区域到国家中心的数据同步速度;实现了数据采集与入库的动态显示,方便用户查看采集与入库的进度与状态;实现了对当前采集状态、采集结果的统计功能。模块的运行界面如图4。
图4左侧图形显示区显示的最近15天数据的采集与入库情况,红色表示还没有采集到数据,亮绿色表示已经采集到数据,深绿色表示数据已经成功入库,通过图形可以非常直观地显示出数据的采集与入库情况。
采集统计结果见图5。
该方案可实现大量前兆仪器的并行数据采集,网络故障在15天之内不影响数据的正常采集,多目标入库可快速实现台站、区域与国家中心的数据同步,数据采集与入库的灵活性增强、效率得到很大提高。
图4 地震前兆数据采集与入库模块主界面Fig.4 Main interface for earthquake precursor data acquisition and storage module
图5 采集文件统计Fig.5 Files acquisition statistics
4 结论
通过对现行地震前兆台网运行管理系统在数据采集与数据入库、数据同步等方面的学习与研究,结合日常应用中发现的问题和不足,提出了新的前兆数据并行采集与多目标入库方案。新的前兆数据采集与入库方案利用智能线程池技术实现了多仪器的并行采集、数据的多目标入库、数据采集与入库的并行运行。通过灵活地配置采集仪器,可满足不同用户的需求。在数据采集功能上,以最近15天的数据采集状态为判断标志,实现了对最近15天内数据的全自动采集,保证15天内总有一天能采集到数据。在数据入库功能上,实现了采集数据的多目标入库,采集来的数据直接保存到目标数据库服务器,在一定程度上省去了中间的交换环节。另外,通过参数服务器的协调工作,还可实现多机并行工作,共同完成同一项采集与入库任务,大大提高了数据采集与多目标入库速度,加快了由台站到区域到国家台网中心的数据同步时间。工作方式更加灵活、使用更为方便,较以前台网管理系统的串行机制在数据采集与入库方面有了很大程度的改善。
1 刘钢,郭晗,王振吉.基于Java的多核多线程编程技术[J].吉林建筑工程学院学报,2009,26(6):77-79,88
2 刘世德,王玉正,韩新强.Windows下实时数据采集的实现[J].中国制造业信息化(学术版),2009,39(10):52-53,57
3 Ami bar.Smart Thread Pool[DB/OL].http://www.codeproject.com/KB/threads/smartthreadpool.aspx.
4 Shawn Cicoria.Proper threading in winforms[DB/OL].NET.http://www.codeproject.com/KB/cs/winformthreading.aspx.2003.
PRACTICAL RESEARCH ON MULTI-THREADED ACQUISITION AND MULTI-OBJECTIVE INVENTORY OF EARTHQUAKE PRECURSOR DATA
Zhang Xingguo1),Wang Ziying1),Liu Jian2)and He Anhua1)
(1)Institute of Crustal Dynamics,CEA,Beijing 100085 2)Institute of Seismology,CEA,Wuhan430071)
The Smart Thread Pool technology is used to respectively achieve seismic precursor data acquisition in parallel and entering warehouse with multiple target by two Thread Pool,and automaticly achieve data detection and collection within 15 days,the quantity of equipments for data gathering originally from several pieces,over 10 machines or over thousands of equipments.Therefore this technique can increase efficiency for seismic precursor data gathering greatly.At the same time,by entering warehouse with multiple target,the synchronous speed enhanced greatly from seismic station to regional center or China Earthquake Networks Center.
multi-threaded;Smart Thread Pool;earthquake precursor;multi-objective storage;data acquisition in parallel
1671-5942(2011)Supp.-0132-06
2010-09-24
中央级公益性科研院所基本科研专项(ZDJ2009-02)
张兴国,男,1973年生,工程师,研究方向:地震前兆应用软件.E-mail:zxgllp@163.com
TP315
A