- Измерването на времената за изпълнение в Linux ви позволява да оптимизирате скриптове, да сравнявате решения и да наблюдавате мащабируемостта на програми и услуги.
- Инструменти като time, dstat, iostat, iotop, ioping и atop помагат за свързване на продължителността на процеса със състоянието на процесора и диска.
- Curl, заедно с мрежови команди като ss, ping и traceroute, ви позволява да анализирате времената за отговор в мрежата и влиянието на мрежата върху производителността.
Измерването на времето, необходимо на една програма да се изпълни в Linux, може да изглежда като проста задача, но доброто ѝ изпълнение е от съществено значение за системата, която „лети“, и тази, която „пълзи“ . Когато започнете да автоматизирате задачи със скриптове, да разработвате приложения или да управлявате сървъри, времето престава да бъде абстрактно число и се превръща в ключова информация за вземане на технически решения.
В ежедневната ни работа не се интересуваме само от това дали нещо е „бързо“ или „бавно“. Нуждаем се от конкретни показатели: секунди, милисекунди и, ако стойността е много голяма, изразени във формат HH:MM:SS за по-добро разбиране. Оттам можем да сравняваме решения, да откриваме пречки, да наблюдаваме тенденциите в производителността и като цяло да следим как се държат нашите програми и услуги.
Защо се интересувате от измерване на времето за изпълнение в Linux?
Когато работите с Linux, независимо дали на личен лаптоп или производствен сървър, познаването на времето за изпълнение на вашите скриптове и програми е безценен инструмент за подобряване на производителността . Не става въпрос само за любопитство: то се изразява в по-малко консумирани ресурси, по-бързи отговори и по-плавно потребителско изживяване.
Една от основните причини за измерване на времето е оптимизацията на производителността: ако не знаете колко време отнема нещо, е невъзможно да разберете дали сте го подобрили или влошили . Като регистрирате продължителността на вашите скриптове за архивиране, обработка на данни или внедряване, можете да определите кои части са най-бавни и да съсредоточите усилията си за оптимизация там.
Това е ключово и за сравняването на решения: в програмирането почти винаги има няколко начина за решаване на един и същ проблем . Можете да имплементирате алгоритъм в Bash, Python или C или да тествате различни заявки към база данни; като измерите времето за изпълнение на всяка алтернатива, можете да изберете тази, която е наистина най-ефективна във вашата конкретна среда.
Друг интересен момент е наблюдението на производителността във времето: скрипт, който се изпълнява бързо днес, може да се влоши след няколко промени . Ако редовно измервате продължителността му, можете да откриете кога започва да отнема повече време от очакваното и да го свържете с модификации на кода, промени в библиотеките или натоварване на системата.
Измерването на времето за изпълнение също помага да се поставят реалистични очаквания – за вас, вашия екип и вашите потребители . Ако знаете, че процесът на импортиране отнема около 20 минути, няма да обещаете, че ще бъде готов „за секунда“. Освен това, тази информация е безценна за планирането кога да се стартират задачи, изискващи големи ресурси, и за правилното оразмеряване на системните ресурси.
И накрая, измерването ви позволява да идентифицирате проблеми с мащабируемостта: скрипт, който работи добре с малки количества данни, може да стане драстично бавен с увеличаване на натоварването . Чрез измерване на продължителността му с различни размери на входните данни или на различни машини е по-лесно да се види дали се нуждае от паралелизация, кеширане, подобрен входно-изходен процес или дори цялостно препроектиране.
Измерете времето за изпълнение, използвайки командата time
В Linux най-директният начин за измерване на времето, необходимо за изпълнение на програма или скрипт, е с командата `time`, прост, но мощен инструмент за получаване на показатели за изпълнение . Най-хубавото е, че не е необходимо да променяте програмата си: просто я извиквате, предшествана от тази команда.
Най-основното използване включва добавяне на думата `time` преди командата, която искате да измерите . Например, ако искате да знаете колко време отнема изброяването на силно натоварена директория, можете просто да въведете командата с `time` в терминала и да изчакате резултата със статистиката.
Когато изпълнението приключи, времето показва три основни времена, които е важно да се разберат . Първото е „реалното“ време, което представлява общото време, изминало от стартирането на командата до нейното завършване, както го възприемате вие като потребител.
В допълнение към данните в реално време, изходът включва стойностите „user“ и „sys“, които предоставят подробна информация за това как е бил използван процесорът по време на изпълнението на програмата . „user“ показва времето, което процесорът е прекарал в изпълнение на кода на вашата програма в потребителски режим, а „sys“ отразява времето, което ядрото е прекарало в извършване на системни повиквания от името на този процес.
Това разделяне е много полезно, защото ви позволява да различите дали дадена програма прекарва време в чисти изчисления или в системни операции, като например достъп до диск и мрежа. Например, процес с много „sys“ може да е с ограничен I/O или да използва интензивно системни повиквания, докато такъв с много „user“ обикновено е по-зависим от процесора.
Ако искате да запазите резултатите от измерванията, можете да пренасочите стандартния изход и изхода за грешки, за да съхраните както данните от командите, така и статистиката за времето . Това ви позволява по-късно да анализирате как се променят времената между различните версии на вашия скрипт или на различни сървъри.
Измерване на времето на Bash скриптове с течение на времето и други техники
Когато се интересувате от цялостен Bash скрипт, подходът не се променя много: можете да стартирате скрипта си, като му добавите префикс `time`, и ще получите общи показатели за неговото изпълнение . Това е идеално за получаване на общ преглед на това колко време отнема завършването на целия процес.
В допълнение към използването на време външно, можете също да измервате специфични интервали в самия скрипт, използвайки променливи за дата и аритметични операции . Например, можете да уловите началното и крайното време в секунди от епохата и да ги извадите, за да определите продължителността на конкретен блок от код.
В много случаи резултатът от изваждането ще бъде голям брой секунди, а четенето на "7432" не е съвсем интуитивно, така че е много практично да се преобразуват тези секунди в по-лесно за използване формат, като HH:MM:SS . Това значително улеснява интерпретацията, особено в лог файлове, които се преглеждат само от време на време.
За да автоматизирате това преобразуване, можете да подкрепите логиката на скрипта със системни инструменти, които форматират дати и часове , или да имплементирате малка функция, която разделя секундите на часове, минути и секунди. Тези видове подробности са от голямо значение, когато става въпрос за разбиране на дългите лог файлове за изпълнение.
Ако искате нещо още по-удобно, можете да създадете малък обвиващ или помощен скрипт, който изпълнява друг скрипт, измерва времето и показва „хубав“ изход с общото време в различни формати . По този начин можете да използвате повторно инструмента във всяка автоматизирана работа, която извършвате на вашата Linux система.
Инструменти за измерване на дисковата активност и нейното влияние върху производителността
Скоростта на програмата не зависи единствено от процесора: производителността на диска силно влияе върху времето за изпълнение на процесите с интензивно четене и запис . Linux предлага няколко конзолни инструмента за наблюдение на случващото се с вашите устройства за съхранение.
Много универсална помощна програма е dstat, която ви позволява да получавате статистика в реално време за активността на диска, наред с много други системни показатели . Ако искате да се фокусирате само върху операциите с входно/изходно управление на диска, можете да използвате съответния параметър, за да филтрирате тази информация и да видите как стойностите се променят всяка секунда.
В изхода на dstat ще видите колони, показващи четения и записи, което ви помага да идентифицирате пикове на входно/изходни операции, които може да забавят програмите ви . Тъй като това е интерактивен инструмент, можете просто да го прекъснете с подходящата комбинация от клавиши, когато имате достатъчно данни за вашия анализ.
Друг класически инструмент е iostat, предназначен да следи натоварването на входно/изходните устройства и да проверява колко дълго са заети . Това е идеално, за да разберете дали някой от вашите дискове е постоянно на 100% натоварване, което ще доведе до по-дълго време за реакция за всяка програма, която има достъп до него.
В системи с много устройства, като например сървъри с множество устройства в контура, може да е полезно да се филтрира изходът, така че iostat да показва само действителните физически дискове . Това се постига чрез регулиране на параметрите, намаляване на шума в изхода и фокусиране на вниманието ви върху това, което наистина е важно.
В дистрибуции като Ubuntu, iostat е част от пакета sysstat, така че ще трябва да го инсталирате, преди да го използвате . След като бъде инсталиран, можете да го настроите да генерира отчети на редовни интервали, което е много полезно за съпоставяне на времето за изпълнение на програми с използването на дисково пространство.
Ако искате да видите кои процеси използват диска най-интензивно във всеки даден момент, можете да използвате „най-важен“ списък , фокусиран върху входно/изходните операции.
Освен това, iotop ви позволява да регулирате интервала на обновяване с опции като -d, за да решите колко често да се актуализира информацията . Имайте предвид, че за да го използвате нормално, ще ви трябват права на суперпотребител или да принадлежите към определени административни групи.
Друга по-малко известна, но невероятно полезна команда е `ioping`, която се фокусира не толкова върху обема на входно/изходните операции, колкото върху латентността на диска . С други думи, тя измерва колко време отнема на хранилището да отговори на заявки, което е от съществено значение за откриване на хардуерни или конфигурационни проблеми, които увеличават забавянията при специфични достъпи.
За да получите цялостен поглед върху вашата система, можете да използвате atop, усъвършенстван инструмент, който разширява възможностите на класическата команда `top` . Сред много други данни, atop показва информация, свързана с производителността на диска, което ви позволява да видите дали проблемът за вашите програми е в паметта, процесора, паметта или мрежата.
Ако се интересувате да се фокусирате единствено върху дисковата част, можете да комбинирате „atop“ с канали и филтри, за да изолирате само информацията, свързана с I/O подсистемата . По този начин ще имате специфичен поглед върху поведението на съхранението, без да се разсейвате от другите показатели.
Измерете времето за уеб отговор от командния ред
Когато искате да измерите „скоростта“ на програма, действаща като уеб услуга, картината се променя малко: тук ключовата точка от данните обикновено е времето за реакция на сайта или API . Linux също предлага инструменти за това, а един от най-мощните и гъвкави е curl.
Командата curl е истински универсален инструмент за прехвърляне на данни, използващ протоколи като HTTP, HTTPS, FTP или FILE . Обикновено се използва за изтегляне на файлове или проверка на HTTP заглавки, но също така крие много интересна функция за измерване на различни частични времена на заявка.
С подходящата опция, curl ви позволява да отпечатате серия от променливи, свързани с разрешаването на имена, връзката и времето за трансфер след операцията . Това означава, че можете да изпратите заявка към URL адрес и да получите в секунди колко време е отнела всяка фаза на процеса.
Ако например искате да проверите поведението на HTTP сайт, можете да извикате curl в безшумен режим, да му кажете какви времеви отпечатъци да отпечата и да отхвърлите съдържанието на отговора, като го пренасочите към /dev/null . Това ви оставя само с показателите за производителност, което е важно в този контекст.
Сред променливите, които можете да покажете, е `time_namelookup`, която показва времето, изминало от началото на операцията до завършването на DNS преобразуването на името . Ако тази стойност е висока, пречката може да е в преобразуването на имена, а не в самия уеб сървър.
Друг важен показател е time_connect, който измерва колко време е необходимо за установяване на TCP връзка със сървъра или проксито . Увеличението на тази стойност може да показва мрежови проблеми, претоварване на сървъра или дори защитни стени, въвеждащи латентност.
Променливата `time_pretransfer` отразява времето от началото до точния момент, в който ще започне прехвърлянето на данни . Следователно тя включва разрешаване на имена, установяване на връзка и договаряне преди предаване.
Също така е важно да се обърне внимание на time_starttransfer, който показва времето от началото на операцията до момента, в който първият байт от отговора е готов за изпращане . Този показател обикновено се свързва с времето, необходимо на сървъра да обработи заявката и да генерира първоначален отговор.
Накрая, имате time_total, който показва общото време, необходимо за цялата операция, от първата стъпка до завършването на прехвърлянето . Това обикновено са данните, използвани като обща справка за „времето за зареждане“ или „времето за реакция“ на уебсайта.
Ако форматът, който искате да отпечатате с curl, е много дълъг или сложен, можете да го запишете в текстов файл и да кажете на curl да го прочете оттам, като използвате съответната опция . Това значително улеснява повторното използване на един и същ изходен шаблон за различни тестове и URL адреси.
В този файл можете да групирате всички времеви променливи, които ви интересуват, използвайки четливи етикети, така че всяко изпълнение на curl да връща кратък отчет за времената за анализирания URL адрес . Това ви позволява бързо да сравнявате различни сървъри, маршрути или конфигурации на приложения.
Измерване на времето на HTTPS сайтове и аспекти, които трябва да се вземат предвид
В случай на уебсайтове, обслужвани през HTTPS, има някои допълнителни стъпки в комуникационния процес, които също си струва да се измерят. Curl включва допълнителни променливи, за да отчете времето, прекарано в SSL/TLS договаряне и всички потенциални пренасочвания.
Една от тези променливи е `time_appconnect`, която измерва времето, необходимо от началото на операцията до завършването на връзката или SSL обмена с отдалечения сървър . Ако имате висока стойност тук, проблемът може да се крие в TLS конфигурацията, сертификатите или самия слой за криптиране.
Друг полезен показател е time_redirect, който обобщава времето, прекарано във всички стъпки на пренасочване преди финалната транзакция . Това включва търсене на имена, връзки и междинни прехвърляния, което ви помага да разберете колко време се губи в 3XX хопове, преди да се достигне финалното съдържание.
Точно както при HTTP, тези променливи могат да бъдат включени във форматиран файл и използвани повторно в тестове, които провеждате срещу различни HTTPS сайтове . По този начин винаги ще имате последователен отчет, който улеснява сравняването на резултатите между сървъри, домейни или тестови среди.
Струва си да се отбележи, че поради самата природа на криптирането, HTTPS сайт обикновено се нуждае от малко повече време за отговор от същия сайт, предлагащ обикновен HTTP . Ако разликата е значителна, може би си струва да се прегледат TLS параметрите, размерите на ключовете или конфигурациите на сървъра.
Важен детайл е, че стойностите, върнати от curl, могат да варират значително от едно изпълнение до друго, дори при привидно сходни условия . Фактори като натоварване на сървъра, претоварване на мрежата или време за отговор на DNS пряко влияят върху времената.
Ето защо е разумно тестовете да се повтарят няколко пъти, в различно време на деня, и да се получават средни стойности или диапазони от стойности . Вземането на решения за оптимизация въз основа на едно-единствено измерване може да доведе до подвеждащи заключения.
Ако искате да се задълбочите още повече във възможностите на curl, винаги можете да се консултирате с man страницата, като използвате съответната команда, за да видите всички налични опции . Там ще намерите много повече променливи за време и усъвършенствани трикове за тестване на уеб производителността.
Полезни мрежови команди за разбиране на закъсненията и загубите
Скоростта на комуникация на програма по мрежа зависи не само от самия код: качеството на връзката и състоянието на мрежата пряко влияят върху времето за нейното изпълнение . Linux предлага няколко команди, предназначени да проверят този аспект.
За начало, имате ss, модерен инструмент за изброяване на активни мрежови връзки с доста подробности . Като го стартирате с подходящите параметри, можете да видите кои TCP връзки са отворени, кои процеси ги използват и в какво състояние са.
Ако се интересувате да знаете кои услуги слушат на определени портове, чакайки входящи връзки , можете също да използвате `ss` с други комбинации от опции. По този начин ще идентифицирате кои услуги може да получават трафик и да влияят на цялостната производителност на сървъра.
За да проверите загубата на пакети и основната латентност към друг сървър, класическият ping остава основен инструмент . Чрез ограничаване на броя на изпратените пакети с подходящата опция, можете бързо да получите средно време за двупосочно пътуване и процент на загуба на пакети.
Ако подозирате проблеми с маршрутизацията, друг полезен инструмент е traceroute, който ви показва през кои мрежови преходи преминават пакетите ви, за да достигнат до местоназначението си . Ще видите списък с междинни рутери и техните времена за реакция, което ви помага да определите точно къде се въвежда забавянето.
В дистрибуции като CentOS или Ubuntu може да се наложи да инсталирате traceroute, използвайки съответния мениджър на пакети, преди да можете да го използвате . След като го инсталирате, просто въведете IP адреса или името на домейна на целевия сървър, за да видите пътя, по който преминават пакетите.
Чрез комбиниране на тези мрежови инструменти с измервания на времето за програмиране и статистика за дисково пространство, можете да изградите сравнително пълна картина за това къде вашите процеси прекарват времето си . Това е от решаващо значение, когато имате разпределени приложения или услуги, които разчитат на външни ресурси.
Реалността е, че командният ред на Linux работи като швейцарско ножче за диагностициране и оптимизиране на производителността на вашата система . От времената за изпълнение на скриптове до мрежовата латентност и насищането на диска, всичко може да бъде измерено с правилните инструменти.
Ако използвате тези команди систематично, документирате тестовете си и записвате резултатите, ще бъде много по-лесно да откривате регресии в производителността, да намирате пречки и да вземате информирани решения относно мащабируемостта . В крайна сметка, точното измерване е първата стъпка към реално подобрение.
Страстен писател за света на байтовете и технологиите като цяло. Обичам да споделям знанията си чрез писане и това е, което ще направя в този блог, ще ви покажа всички най-интересни неща за джаджи, софтуер, хардуер, технологични тенденции и много други. Моята цел е да ви помогна да се ориентирате в дигиталния свят по лесен и забавен начин.