Оптимизируй это! или как нам обустроить компьютер |
|
|
Часть VДефрагментацияИзлишне напоминать, что фрагментированные данные сильно замедляют работу системы и приводят к преждевременному износу диска. Поэтому регулярная дефрагментация не просто желательна, а жизненно необходима. Итак, рассмотрим два подхода к дефрагментации. Первый, и вполне достойный, представлен дефрагментатором JkDefrag. Эта умная софтинка замечательна тем, что может запускаться, как хранитель экрана (скринсейвер). Таким образом, мы автоматически получаем почти всю нужную нам функциональность. Единожды настроив JkDefrag, мы навсегда сбрасываем с себя груз забот об оптимизации диска. Всякий раз, когда вы пойдёте пообедать или мило поболтать с секретаршей шефа, компьютер, вздохнув свободнее, в ваше отсутствие запустит дефрагментатор, а уж тот сделает своё доброе дело. Если вы вернулись раньше, чем компьютер рассчитывал (невкусный обед или Леночка нынче нелюбезна), он, не ропща, молча остановит дефрагментацию и предоставит систему в ваше полное распоряжение. Второй вариант. Необъятное множество дефрагментаторов сразу резко сузим, наложив на него требования, озвученные ещё в первой статье: дефрагментатор должен быть модульным и должен управляться из командной строки. Как вы понимаете, эти критерии – не прихоть сибарита, а вполне разумный подход, позволяющий перепоручить уход за собой самому компьютеру. «Perfect Disk» - это навороченный дефрагментатор с чёртовой уймой настроек и опций. Однако, он отвечает нашим требованиям – управляем командной строкою. После его инсталляции следует перевести службы «PD91Engine» и «PD91Agent» в «ручной» режим запуска. Они нам без надобности. Их предназначение мы реализуем с помощью простейших заданий для nnCron’а, а вот занимаемую этими службами память высвободим. В Листинге 1 показаны два «эффектора». Как явствует из названия, первый эффектор запускает дефрагментацию. При этом «Perfect Disk» сам запустит потребные ему службы. Задание «stop_defrag» остановит не только процесс дефрагментации, но и запущенные вспомогательные службы. Нечего им делать в памяти в отсутствие дефрагментатора. Но это только цветочки. Ягодки, как водится впереди.
#( run_defrag VARIABLE DISK_DEFRAG NoLog RunOnce NoDel AsLoggedUser LoadProfile Time: 7 16 17 7 * 2007 Action: SWHide IdlePriority
FILE-EXIST: "C:\Program Files\Raxco\PerfectDisk2008\PDCmd.exe" IF DISK_DEFRAG GET PROC-EXIST: "PDEngine.exe" NOT IF START-APPW: "C:\Program Files\Raxco\PerfectDisk2008\PDCmd.exe" /ALL /ALLDRIVES /SmartPlacement /WAIT THEN DISK_DEFRAG RELEASE THEN )#
#( stop_defrag NoLog RunOnce NoDel AsLoggedUser LoadProfile Time: 7 16 17 7 * 2007 Action: SWHide NormalPriority
PROC-EXIST: "PD91Engine.exe" IF START-APPW: "C:\Program Files\Raxco\PerfectDisk2008\PDCmd.exe" /STOP /AllDrives THEN
PROC-EXIST: "PD91Engine.exe" IF START-APP: net stop "PD91Engine" THEN
PROC-EXIST: "PD91Agent.exe" IF START-APP: net stop "PD91Agent" THEN )# Листинг 1
Конечно же, запускать вручную эти задания мы не собираемся. Позаботимся о том, чтобы nnCron мог отслеживать периоды бездействия пользователя (трёп с секретаршей Леночкой) и возобновления пользовательской активности, если Леночка отшила. Этим у нас займётся управляющее задание «ComputerMonitoring» - см. Листинг 2. Здесь всё ясно без слов. Когда компьютер поймёт, что вы опять занимаетесь чёрт-те чем, он (бережёного бог бережёт!) создаст точку восстановления, выполнит полную очистку дисков и запустит дефрагментацию. Как только вы, полный радужных надежд (или потирая щёку), вернулись к своему молчаливому и не осуждающему напарнику, он остановит процесс дефрагментации, дабы лишний раз не раздражать вас ещё и тормозами.
#( ComputerMonitoring NoLog RunOnce NoDel AsLoggedUser LoadProfile Time: 13 14 29 4 * 2008 Action:
\ Если усер не работает 10 минут... IDLE: 600 IF \ ...и загрузка процессора в течение 9 минут ниже 3%... 540000 (CPU-USAGE) . ." %" CR 3 < IF FILE-EXIST: "C:\Program Files\nnCron\Flags\PersistentConnect.flag" IF PROC-EXIST: "PDCmd.exe" NOT IF Создание_точки_восстановления RUN Очистка_диска RUN Глубокая_очистка_дисков RUN
run_defrag RUN THEN ELSE PROC-EXIST: "spidernt.exe" NOT PROC-EXIST: "PDCmd.exe" NOT AND IF Создание_точки_восстановления RUN Очистка_диска RUN Глубокая_очистка_дисков RUN
run_defrag RUN THEN THEN THEN THEN
\ Если усер возобновил работу, остановить дефрагментацию IDLE: 10 IF ELSE PROC-EXIST: "PDCmd.exe" IF stop_defrag RUN THEN THEN )# Листинг 2
Подводя итог содеянному (я не про Леночку!), с удовлетворением резюмируем, что и эту работёнку - заботу о дефрагментации - мы спихнули на безответный компьютер. Вот так всегда, кому все прелести этой жизни - кафе, кино, ну и так далее, а кому – скучная оптимизация дисковых разделов… Но и это ещё не конец сказки. Смотрим на усложнённое задание «Ежеминутно» в Листинге 3. Почти в самом его конце видим выполнение задания «ComputerMonitoring». То есть, в конечном итоге, всё это работает так: в «Ежеминутно» каждые 10 секунд выполняется цикл, в котором, в том числе, эффектором «ComputerMonitoring» анализируется активность пользователя или отсутствие таковой. По результатам анализа принимается решение, запускать ли процесс дефрагментации или останавливать его. Или ничего не делать, а подождать ещё немножко…
#( Ежеминутно NoLog NoDel AsLoggedUser LoadProfile VARIABLE EVERY_MIN Action: SWHide NormalPriority
Процессы_по_ядрам RUN
\ 6 итераций цикла с паузой в 10 секунд 6 0 DO EVERY_MIN GET \ Если флешка с еБустером "отвалилась", остановить службу FILE-EXIST: "%eBoostr_Letter%:\eboostr.dat" NOT IF eBoostr_stop RUN THEN
FILE-EXIST: "C:\Program Files\nnCron\Flags\PersistentConnect.flag" NOT IF \ Если связь с интернетом наличествует HOST-EXIST: "rbc.ru" IF \ Если защиты нет, включить её PROC-EXIST: "acs.exe" NOT IF OnBeginConnect RUN THEN
\ Выполнить обновление при первом обнаружении соединения с интернетом UpdateOnceADay RUN ELSE WIN-EXIST: "Установка связи*" IF ELSE WIN-EXIST: "Подключение по локальной*" IF ELSE OnDisconnect RUN THEN THEN THEN THEN
ComputerMonitoring RUN
PAUSE: 10000 EVERY_MIN RELEASE LOOP )# Листинг 3
Оптимизация 2.0Продолжим наши рассуждения об оптимизации дискового ввода-вывода. Антивирусный монитор, нагружающий подсистему ввода-вывода, мы приручили, заставив его возникать, только по необходимости. Диски от всякого хлама мы очищаем и периодически дефрагментируем. Вернее, мы-то с Леночкой обсуждаем международное положение нашей страны, а всю грязную работу спихнули на компьютер, который даже возмутиться толком не может. Надо бы ему жизнь подсластить… Если у вас есть два и более физически разных «винта», грех этим не воспользоваться. Можно из них смастерить RAID-массив, но эту тему мы обойдём сторонкой: профи и без нас разберутся. А можно часть ввода-вывода перенаправить на второй диск, и будет нам от этого счастье: головки-то винтов теперь будут дёргаться параллельно, что несколько ускорит работу системы в целом. Распараллелить обращения к дискам совсем просто. Создайте на втором диске папку «TEMP» и переназначьте туда переменные среды «TEMP» и «TMP». А ещё перетащите туда своп-файл «pagefile.sys». Вам это ничего не стоит, а компьютеру приятно. Также можно некоторые программы устанавливать не в «C:\Program Files», а на второй диск. Если вы сумеете включить разные винты в разные контроллеры, жизнь и вовсе станет прекрасной и удивительной. Но этим, собственно, и ограничивается веер возможностей применения второго винта для оптимизации (без учёта построения RAID-массива). Пора задуматься о чём-нибудь поинтереснее. Продолжаем приводить в порядок свои мысли, компьютер, жизнь. С Леночкой надо что-то решать. Итак, в Windows Vista впервые появилась технология «Ready boost», которая позволяет ускорить запуск приложений, создав кеш-файл на флешке. Некоторые ошибочно называют это «ускорением работы», но они ошибаются. Эта технология не увеличит ни тактовую частоту процессора, ни объём и скорость работы оперативной памяти. Она просто ускоряет именно запуск приложений за счёт всё того же распараллеливания ввода-вывода: наиболее часто используемые файлы (приложения, DLL-ки, и т.п.) переносятся на флешку, а специальный драйвер при обращении к файлу смотрит: если дубликат этого файла есть на флешке, он считывается оттуда. Таким образом, даже если флешка не шибко шустрая, ускорение запуска приложений имеет место быть, т.к. набившие оскомину головки «винта» не ёрзают по всей поверхности диска в поисках нужных файлов, а вальяжно считывают редкие файлы, не сдублированные на флешку. Остальные же файлы «подкачиваются» с неё. А уж если флешка скоростная, с надписью «Ready boost», всё будет порхать, как во сне! Нашлись добрые люди, которые и для Windows XP создали подобный драйвер: http://www.eboostr.com. Причём, эта вещь более продвинутая, чем в Windows Vista. Например, здесь можно создать список исключений; действительно, не имеет смысла закачивать на флешку ваши любимые звуковые файлы или фильмы: места они займут о-го-го, а толку от их размещения в файле кэширования – ноль. Кроме того, приятно, что и эта софтина – модульная: собственно работу выполняет драйвер, оформленный в виде службы «eBoostr Service», а настраивать и мониторить его работу можно из панели управления («eBoostr Control Panel»), которая запускается (или не запускается) отдельно. Как всегда, после установки приложения, переводим его службу в ручной режим запуска, а панель управления «eBoostr Control Panel» убираем из автозагрузки с помощью «msconfig.exe». Делается это во исполнение нашей концепции, согласно которой, всякому овощу своё время. Понятно, что eBooster должен работать только при наличии флешки, содержащей его кеш-файл. Если флешка отсутствует, этому драйверу нет смысла болтаться в памяти. Наличие флешки в разъёме USB-порта проверяется двояко. Во-первых, в момент загрузки Windows; если в этот момент нужная флешка вставлена, служба «eBoostr Service» будет запущена и начнёт свою ускоряющую работу; если флешки нет, служба не стартует. Во-вторых, в процессе работы Windows. Если флешки (с файлом кеша) не было, и вдруг вы её вставили, компьютер это «прочухает» и быстренько запустит «ускорялку». Напротив, если вы извлекли флешку, компьютер остановит ставшую ненужной службу; ну и контрольную панель срубит… Вообще, в том, как наш компьютер пристально следит за службами и останавливает ставшие ненужными, просматривается аналогия с термином из программирования «сборка мусора». Для реализации такого поведения компьютера нужно: указать ему, под какой буквой будет видна флешка с кеш-файлом, а также смастрячить управляющие задания. Займёмся этим. Во-первых, в самом начале кронтаба (файла со скриптами для nnCron) у нас есть такая запись: <% \ Буква флешки, содержащей файл eboostr.dat fVAR eBoostr_Letter S" B" TO eBoostr_Letter %> Это и есть указание, на каком диске (флешке) у нас создан кеш-файл для eBooster’а. Во-вторых, в Листинге 4 представлены два «эффектора», которые запускают и останавливают службу «eBoostr Service».
#( eBoostr_start RunOnce Time: 41 16 18 10 * 2007 NoLog NoDel Action: SWHide NormalPriority
FILE-EXIST: "%eBoostr_Letter%:\eboostr.dat" PROC-EXIST: "EBstrSvc.exe" NOT AND IF START-APP: net start "eBoostr Service" THEN )#
#( eBoostr_stop RunOnce Time: 41 16 18 10 * 2007 NoLog NoDel Action: SWHide NormalPriority
PROC-EXIST: "EBstrSvc.exe" IF START-APP: net stop "eBoostr Service" THEN
PROC-EXIST: "eBoostrCP.exe" IF KILL: "eBoostrCP.exe" TRAY-REFRESH THEN )# Листинг 4
В Листинге 5, в задании, обрабатывающем событие «извлечение диска», в конце видна обработка ситуации, когда вынимается флешка с кеш-файлом: при этом служба кэширования будет остановлена.
#( OnFlashEjectAny NoLog AsLoggedUser WatchDriveRemove: "*" Action: SWHide NormalPriority
Удалить_флаг_вставленного_диска RUN
CF-ACTIVE? IF HOST-EXIST: "rbc.ru" NOT IF spidernt_stop RUN THEN THEN
\ Если вынимается флешка с кешем для eBoostr FILE-EXIST: "%eBoostr_Letter%:\eboostr.dat" NOT IF eBoostr_stop RUN THEN )# Листинг 5
В шестом листинге показаны мгновения загрузки Windows. Если в этот момент флешка торчит в разъёме, служба «eBoostr Service» будет запущена, и дальнейшая загрузка системы пройдёт под флагом ускорения и перестройки.
#( OnStartup NoLog Time: START-TIME Action:
Удалить_флаг_вставленного_диска RUN
\ Если вставлена флешка, содержащая файл кеша для eBoostr FILE-EXIST: "%eBoostr_Letter%:\eboostr.dat" IF eBoostr_start RUN THEN )# Листинг 6
Наконец, в Листинге 7, в скрипте, обрабатывающем событие вставки флешки, видна обработка той ситуации, когда в разъём вставляется флешка с кеш-файлом. То есть, если эта флешка появилась на сцене уже в процессе работы, после загрузки, компьютер это не оставит без внимания, и запустит свою «ускорялку».
#( OnDisk_insert WINAPI: GetDriveTypeA Kernel32.dll 0 VALUE DiskType NoLog AsLoggedUser LoadProfile WatchDriveInsert: "*" Action: SWHide NormalPriority
CF-ACTIVE? IF \ Нарыть тип новоявленного диска S" %DRIVE-LETTER%:\" EVAL-SUBST DROP GetDriveTypeA TO DiskType
FILE-CREATE: "C:\Program Files\DiskInserted.flag"
DiskType 5 = IF \ Если это CD/DVD \ Врубить SpiderNT \ spidernt_start RUN ELSE \ Если это НЕ CD/DVD \ Если флешка содержит файл кеша для eBoostr FILE-EXIST: "%DRIVE-LETTER%:\eboostr.dat" IF eBoostr_start RUN ELSE \ Временно запретить выполнение задачи "OnFlashEjectAny" OnFlashEjectAny @ CF-ACTIVE CLR-CRON-FLAG
\ Врубить SpiderNT spidernt_start RUN
\ Включить "отменялку" запрета выполнения задачи "OnFlashEjectAny" EnableSpiderStop @ CF-ACTIVE SET-CRON-FLAG THEN THEN THEN )# Листинг 7
Ядерная физикаЕщё в бытность мою в студенческом отряде я убедился в том, что «щелкопёр» практически всегда – синоним некомпетентности и снобизма. С тех пор было множество поводов укрепиться в этом мнении. Исключением являются, пожалуй, только технические и научные журналисты. Им приходится вникать в суть описываемых проблем, чтобы не лохануться перед читателями, которые зачастую компетентны не менее авторов. Существует устоявшаяся терминология: реакция распада (тяжёлых) атомных ядер, например, урана или плутония, называется реакцией деления атомного ядра, или атомного распада, или атомной. А реакция слияния или синтеза (лёгких) ядер, например, изотопов водорода, называется реакцией ядерного синтеза, или ядерной. Бомбы, использующие принцип распада атомного ядра, называются атомными. Атомные станции вырабатывают энергию, используя контролируемую реакцию атомного распада. Бомбы, использующие реакцию синтеза ядер лёгких элементов, называются ядерными. Они помощнее атомных будут, атомный заряд используется в ядерной бомбе в качестве запала. "Кузькина мать" - из их числа. А термоядерных электростанций ещё не построили.
Но все наши журналистики, как сговорились, в один голос называют всё атомное (энергетику, реакторы, бомбы и т.д.) ядерным. Нравится им это слово. Звучит, наверное, красивше… Ну не будет у Ирана и Кореи ядерной бомбы, НЕ-БУ-ДЕТ!!! Они ещё под стол пешком ходят, им атомную смастерить - и счастья полны штаны будут, слюнями всех забрызгают. Что-то я разошёлся… Или расходился? Достали непрофессионалы. Вообще, непрофессионалы - примета нашего времени. Сплошь и рядом, на каждом шагу. Ядерная механикаТеперь поговорим об оптимизации работы многоядерных компьютеров. Про диалектику слыхали? А я её проходил. Так вот, диалектика – это единство и борьба противоположностей. По крайней мере, так говорил классик. Как бы странно это ни выглядело, мы имеем два прямо противоположных метода ускорения работы: использование многоядерности и отказ от её использования. Использование многоядерностиОб этом особо растекаться мыслию не буду. Приложения под Windows по умолчанию используют все имеющиеся в наличии ядра. Если умеют. Например, многие архиваторы, кодировщики видео, компиляторы умеют это делать. Но многие другие приложения – не обучены. Это уж от их разработчиков зависит. Кроме того, можно ускорить загрузку Windows, приказав ей использовать все имеющиеся ядра именно в процессе загрузки. Для этого надо сделать пару телодвижений. Если у вас Windows XP SP2, убедитесь, что вы уже «накатывали» обновление «KB896256»; если вы работаете на SP3, всё в порядке. А уж уж Windows Vista и сама во всём разберётся. Затем в «boot.ini» в строке запуска системы добавьте ключ «/usepmtimer» - теперь система будет использовать все ядра не только в процессе работы, но и при загрузке. Говорят, способствует… НЕ-использование многоядерностиТочнее, избирательный отказ от выполнения некоторых приложений на двух и более ядрах. Именно тех, которые до сих пор не умеют пользоваться преимуществами современных систем. Такие приложения умеют работать только на одном ядре (процессоре), а Windows начинает ими жонглировать, перебрасывать процесс с одного ядра на другое. А ведь при этом имеют место накладные расходы: для переброски процесса требуется запомнить его состояние, содержимое регистров и памяти, и т.д. А после «приземления» процесса на другое ядро всё это хозяйство требуется восстановить, чтобы программа продолжила работу на новом месте. Всё это выливается в заметное (не человеку, так компьютеру) время. Нам это зачем? Правильно, фигня какая-то. Пора заняться и этим вопросом. Всё, на что мы обращаем свой взор, начинает работать, как хорошо смазанный механизм, чётко, тихо, незаметно и надёжно. Так не посрамим!.. Итак, надо немножко поизучать приложения, которыми вы пользуетесь и определить те из них, которые не умеют задействовать несколько ядер. Затем надо определиться, какие процессы на какие ядра будем разруливать. Я считаю первое ядро основным, на нём у меня выполняются «тяжёлые» приложения: компилятор программ, виртуальная машина VMware, и т.д. А вот всякие необязательные, но приятные полезняшки (часики в уголке экрана, AIMP (MP3-проигрыватель), BSplayer (просмотр фильмов), Beholder (просмотр TV)), а также MS Word, Excel, spiderml.exe, spiderui.exe, ReGet, и т.д. «сваливаю» на второе ядро: по крайней мере, они не будут отвлекать компьютер от важных задач. Как всегда, рулить всем у нас будет nnCron. Надо настрогать много маленьких заданий, которые будут перекидывать эти программы на нужное ядро сразу же при их запуске. Здесь же можно и назначить приоритет выполнения этих задач. Примерный список таких заданьиц приведён в Листинге 8. Расширять и изменять его можно почти до бесконечности, насколько хватит фантазии. А задание "CheckFlags" отключит все эти эффекторы, если в вашем компьютере всего один процессор (ядро).
#( BSPLAYER_to_CPU2 NoLog AsLoggedUser LoadProfile WatchProc: "bsplayer.exe" Action:
CF-ACTIVE? IF S" bsplayer.exe" 2 AFFINITY THEN )#
#( TV_to_CPU2 NoLog AsLoggedUser LoadProfile WatchProc: "BeholdTV.exe" Action:
CF-ACTIVE? IF S" BeholdTV.exe" 2 AFFINITY THEN )#
#( WINWORD_to_CPU2 NoLog AsLoggedUser LoadProfile WatchProc: "WINWORD.EXE" Action:
CF-ACTIVE? IF S" WINWORD.EXE" 2 AFFINITY THEN )#
#( EXCEL_to_CPU2 NoLog AsLoggedUser LoadProfile WatchProc: "EXCEL.EXE" Action:
CF-ACTIVE? IF S" EXCEL.EXE" 2 AFFINITY THEN )#
#( XNVIEW_to_CPU2 NoLog AsLoggedUser LoadProfile WatchProc: "xnview.exe" Action:
CF-ACTIVE? IF S" xnview.exe" 2 AFFINITY THEN )#
#( DIVXSM_to_CPU2 NoLog AsLoggedUser LoadProfile WatchProc: "DivXsm.exe" Action:
CF-ACTIVE? IF S" DivXsm.exe" 2 AFFINITY THEN )#
#( spiderml_to_CPU2 NoLog AsLoggedUser LoadProfile WatchProc: "spiderml.exe" Action:
CF-ACTIVE? IF S" spiderml.exe" 2 AFFINITY THEN )#
#( spiderui_to_CPU2 NoLog AsLoggedUser LoadProfile WatchProc: "spiderui.exe" Action:
CF-ACTIVE? IF S" spiderui.exe" 2 AFFINITY THEN )# #( OutlookOn NoLog AsLoggedUser LoadProfile WatchProc: "OUTLOOK.EXE" Action:
FILE-EXIST: "C:\Program Files\nnCron\Flags\MultiProc.flag" IF S" OUTLOOK.EXE" 2 AFFINITY THEN
HOST-EXIST: "mail.ru" IF \ Дождаться окончания загрузки OUTLOOK PAUSE: 2000
FOR-PROCS: "OUTLOOK.EXE" FOUND-PID PROC-WAIT-IDLE ;FOR-PROCS
spiderml_start RUN THEN )# #( op_mon_to_CPU2 NoLog AsLoggedUser LoadProfile WatchProc: "op_mon.exe" Action:
CF-ACTIVE? IF S" op_mon.exe" 2 AFFINITY THEN )#
#( nero_to_CPU1 NoLog AsLoggedUser LoadProfile WatchProc: "nero.exe" Action:
FILE-EXIST: "C:\Program Files\nnCron\Flags\MultiProc.flag" IF S" nero.exe" 1 AFFINITY THEN
S" nero.exe" HIGH_PRIORITY_CLASS PRIORITY )#
#( ReGetDx_to_CPU2 NoLog AsLoggedUser LoadProfile WatchProc: "ReGetDx.exe" Action:
CF-ACTIVE? IF S" ReGetDx.exe" 2 AFFINITY THEN )#
#( Ad-Aware_to_CPU2 NoLog AsLoggedUser LoadProfile WatchProc: "Ad-Aware.exe" Action:
FILE-EXIST: "C:\Program Files\nnCron\Flags\MultiProc.flag" IF S" Ad-Aware.exe" 2 AFFINITY THEN
S" Ad-Aware.exe" IDLE_PRIORITY_CLASS PRIORITY )#
#( AIMP2_to_CPU2 NoLog AsLoggedUser LoadProfile WatchProc: "AIMP2.exe" Action:
CF-ACTIVE? IF S" AIMP2.exe" 2 AFFINITY THEN )# Листинг 8
#( CheckFlags
В этой статье мы описали методы повышения эффективности работы за счёт оптимизации подсистемы ввода/вывода и использования преимуществ мультипроцессорных компьютеров. |
|
|