вторник, 16 ноября 2010 г.

~700 часов архивирования...

Такую цифру выдал WinRar при архивации более трех миллионов файлов (3 241 083 Files 1108 Folders - одна папка на день) общим объемом 76,1Гб(83,1Гб на диске):


Представлявшим из себя файлы мониторинга доступа к сетевым шарам - результат работы специально, написанного для этих целей мной скрипта (в течение около 3-х лет!!!):
("N1 20-секундный мониторинг доступа к файлм по сети к папке FolderName.vbs")
---------------------------------------------------------------------------------
'************************************************************
'------ скрипт показывает все открытые файлы удаленными пользователями
' по маске пути на ФС
'************************************************************
On Error Resume Next
Dim Server,file,oFileService
'------- пауза между сборами информации в миллисекундах - без учета задержки на время выполнения
Const TimeToSleep = 20000
'------- имя файлового сервера
Server = "ServerName"
'------- путь для сохранения файлов отчетов
StrOutFileName = "I:\FolderNameForSaveReports\Daily\"
'------- маска пути к открытому файлу
StrMaskPathToCheckOpenedFile = "H:\FolderNameForMonitoring"
While Not False
'------- интервал времени для сбора данных
If ( ( Hour(time) >= 6 ) AND ( Hour(time) < 23 ) ) Then
StrTimeStamp = FuncDate() & " " & FuncTime()
StrOutFileName & StrTimeStamp, StrMaskPathToCheckOpenedFile
ShowALLOpenedFileToMaskPathByRemoteUsers Server, StrOutFileName & FuncDate() & " " & FuncTime() &" открытые файлы.txt", StrMaskPathToCheckOpenedFile
'------- пауза между сборами инфы
WScript.Sleep(TimeToSleep)
Else
WScript.Quit
End If
Wend
'***************************************************************
'----------------функция----------------------------------------
'показывает все открытые файлы удаленными пользователями
' по маске пути на ФС
Function ShowALLOpenedFileToMaskPathByRemoteUsers(MyServerName, MyStrOutFileName, MyStrMaskPathToCheckOpenedFile)
Dim oFileService
Set oFileService = GetObject("WinNT://" & MyServerName & "/lanmanserver,fileservice")
'------- указатель на то, что мы первый раз добавляем строку нужен для создания самого файла отчета
FlagFirstAddString = true
'------- цикл фильтрации по маске
For Each oResource In oFileService.Resources
If LCase(Mid(oResource.Path,1,Len(MyStrMaskPathToCheckOpenedFile))) = LCase(MyStrMaskPathToCheckOpenedFile) Then
'FuncAppendOneStrToTXTFile MyStrOutFileName, oResource.Path & " User: " & oResource.User
z = oResource.Path & " " & oResource.User
'------- проверка на то, что фильтруемая строка не пуста
If Not(z = " ") Then
'------- проверка флага первой записи для создания файла
If FlagFirstAddString Then
FlagFirstAddString = False
FuncCreateTXTFile( MyStrOutFileName )
FuncAppendOneStrToTXTFile MyStrOutFileName, z '& " User: " & oResource.User
'WScript.Echo "If FlagFirstAddString Then"
Else
FuncAppendOneStrToTXTFile MyStrOutFileName, z '& " User: " & oResource.User
'WScript.Echo "If FlagFirstAddString Then"
End If
'WScript.Echo "If (z <> "") Then"
End If
'WScript.Echo "If LCase(Mid(o"
End If
'WScript.Echo "cycle"
Next
End Function
'***************************************************************
'----------------функция----------------------------------------
'создает txt - файл
'файл не должен быть создан
Function FuncCreateTXTFile(FileName)
'------------------------Константы для задания типа открытия файла
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Const OverwriteTrue = True, OverwriteFalse = False, UnicodeTrue = True, UnicodeFalse = False
Const ReadOnlyDeletionTrue = True, ReadOnlyDeletionFalse = False
' Объявляем переменные
Dim objFSO, FOut
' Создаем объект FileSystemObject
Set objFSO=WScript.CreateObject("Scripting.FileSystemObject")
' Открываем выходной файл для записи
Dim File
Set File = objFSO.CreateTextFile(FileName, OverwriteTrue,UnicodeFalse)
' Закрываем выходной файл
FuncCreateTXTFile = true
End Function
'***************************************************************
'----------------функция----------------------------------------
'добавляет строчку в текстовый файл
Function FuncAppendOneStrToTXTFile(FileName, StrText)
'------------------------Константы для задания типа открытия файла
Const ForReading = 1, ForWriting = 2, ForAppending = 8, OverwriteTrue = True, OverwriteFalse = False
' Объявляем переменные
Dim objFSO, FOut
' Создаем объект FileSystemObject
Set objFSO=WScript.CreateObject("Scripting.FileSystemObject")
' Открываем выходной файл для записи
Set FOut = objFSO.OpenTextFile (FileName,ForAppending,true)
' Записываем текстовую строку в файл
FOut.WriteLine StrText' & vbcrlf
' Закрываем выходной файл
FOut.Close
FuncAppendOneStrToTXTFile = true
End Function
'***************************************************************
'----------------функция----------------------------------------
' -------- исполняе команду
Sub RunStr(StrToRun)
' ------------- Создаем объект WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
' ------------- Открываем созданный файл в Блокноте
Const WindowStyle = 1
Const WaitOnReturn = true
WshShell.Run StrToRun, WindowStyle, WaitOnReturn
Set WshShell = Nothing
End Sub
'***************************************************************
'----------------функция----------------------------------------
'возвращает дату
Function FuncDate()
'формирование строки даты
StrYear = Year(date)

If Month(date)<10 Then
StrMonth = "0" & Month(date)
Else
StrMonth = Month(date)
End If

If Day(date)<10 Then
StrDay = "0" & Day(date)
Else
StrDay = Day(date)
End If

FuncDate = StrYear & StrMonth & StrDay
End Function
'***************************************************************
'----------------функция----------------------------------------
'возвращает время с точ до минуты
Function FuncTime()
'TimeStr = Hour(time) & "-" & Minute(time) & "-" & Second(time)
If Second(time)<10 Then
StrSecond = "0" & Second(time)
Else
StrSecond = Second(time)
End If

If Minute(time)<10 Then
StrMinute = "0" & Minute(time)
Else
StrMinute = Minute(time)
End If

If Hour(time)<10 Then
StrHour = "0" & Hour(time)
Else
StrHour = Hour(time)
End If

'FuncTime = StrHour & StrMinute & StrSecond
FuncTime = StrHour & "-" & StrMinute & "-" & StrSecond
End Function
---------------------------------------------------------------------------------



правда уже через один 1 час 49 минут время было скорректировано и составило 150 часов:



при этом Всё время архивации составило 13,5 часов.

Некоторые пишут драйвер перехвата вызовов API - это, пожалуй более правильный вариант, но более трудоемкий и, к тому же, платные решения, как раз на нем и строятся - к примеру ScriptLogic - File System Auditor 2, который в своей работе может использовать различные СУБД, отказались от скрипта когда приобрели это программное решение. На нашем Enterprise сервере при нагрузку более 1500 пользователей рост базы составил около 3Гб в день.

Да, "File System Auditor 2" предоставляет более развитые средства отчетности поскольку база с простой логикой и можно напрямую писать скрипты в ней для вытаскивания отчетов, что мы и делали, поскольку интерфейс отчетности у него (File System Auditor 2 - Report Configuration Console) жутко тормозной, он пытается постоянно подтянуть данные без пользовательского разрешения на то, и приходиться ждать по 10-20 минут пока он это сделает для того что бы скорректировать в GUI запрос.

Но есть нюанс с которым не поспоришь - скрипт - бесплатен для мониторинга доступа к файлам по сети - частоту опроса настраиваем через шедулинг системы - указываем время как хотим, да здесь придется признать, что, если пользователь за время (у меня было - каждые 20 секунд) равное интервалу между опросами откроет папку скопирует файл и закроет папку, то мы даже и не узнаем, что был такой доступ к нему, но я решил что это невозможно, хотя если потренироваться то... (вообще это было гипотезой отчасти неверной). Просто 20 секунд это было ещё время оптимальное для снижения нагрузки, поскольку во время работы скрипта нагрузка составлял 10-15% по Диспетчеру задач, а таких "мониторингов" было несколько для разных папок, поэтому при из перекрещивании они суммировали нагрузку, что давало не малую нагрузку на процессор. Для поиска доступа достаточно было скопировать фалы за определенную дату в отдельную папку и выполнить поиск по содержимому - такое вот "наколенное" решение, но весьма приемлемое.

Кстати, самый большой минут "File System Auditor 2" это при обновлении сервера Garant, расположенного на том же файловом сервере у нас, почему то... кратковременно сбрасывались все коннекты, что для нас очень критично, поэтому во время обновления справочно информационной системы Гарант мы просто останавливали "File System Auditor 2", для предотвращения подобных инцидентов.

Комментариев нет:

Отправить комментарий