От Даси Орлеандо, автор на Блог на Alibaba Cloud Community.

Тази статия ще разгледа инструмента с отворен код Archas на Alibaba, неговите основни функции и как можете да започнете да го използвате. Преди да започнем, нека първо обсъдим какво точно представлява Archas и защо бихте искали да го използвате.

Arthas е диагностичен инструмент с отворен код, създаден от Alibaba, за да помогне на разработчиците лесно да отстраняват производствени проблеми в Java приложения. Това означава, че Arthas прави нещата удобни, защото с него разработчиците могат да отстраняват различни технически проблеми, без да е необходимо да актуализират изходния код или да рестартират сървъра.

Какво Arthas всички функции

Нека да разгледаме някои от основните, ключови характеристики на текущата версия на Arthas, която към момента на писане на тази статия е „версия 3.1.1“. Артас може да направи следното:

  • Проверете дали класът е зареден
  • Декомпилирайте класовете, за да сте сигурни, че кодът работи според очакванията
  • Преглед на статистиката за зареждане на класове и информацията за извикване на метод (включително съответните параметри, върнат обект и хвърлени изключения)
  • Проверете проследяването на стека на указаното извикване на метод
  • Проследете извикването на метода, за да проследите бавното извикване
  • Наблюдавайте статистическите данни за извикване на метод (като заявки в секунда, време за отговор и процент на успех)
  • Наблюдавайте елементи като системни показатели, състояния на нишки, използване на процесора и статистики за събиране на отпадъци
  • Поддръжка на telnet и уеб сокет както за локално, така и за отдалечено отстраняване на грешки с помощта на команден ред и интерфейс на браузъра
  • Поддръжка на Javaa Development Kit 6+
  • Поддържа Linux, MacOS и Windows

Всички издания на Arthas са описани на тази страница.

Инсталиране и стартиране на Arthas

Arthas може да се изпълнява на повечето от основните операционни системи, включително Linux, MacOS и Windows. Просто ще трябва да се уверите, че Java Virtual Machine 6 или по-нова версия е инсталирана на вашата система, преди да започнете да настройвате Arthas. Най-общо казано, Arthas се състои от един единствен изпълняващ се Jar файл, който се нарича arthas-boot, който е runner на Arthas.

За да изтеглите arthas-boost, можете да използвате следната команда:

wget https://alibaba.github.io/arthas/arthas-boot.jar

След това можете да използвате следната команда, за да управлявате Arthas:

  • Изпълнение: java -jar arthas-boot.jar
  • Получаване на помощ: java -jar arthas-boot.jar –h

Използване на Arthas и Arthas команди

От командата за помощ на Arthas (-h), можем да видим, че има много опции, които са възможни за адресиране или активиране на някои специфични функции на диагностичния инструмент. Ето някои интересни, които могат да бъдат често използвани:

  • --target-ip: В случай, че целевата виртуална машина на Java се намира на конкретен IP адрес в мрежата, тогава по подразбиране е 127.0.0.1 (което е localhost).
  • --telnet-port: Целевата Java Virtual Machine слуша telnet порт. Портът по подразбиране е 3658.
  • --http-port: Целевата виртуална машина на Java слуша HTTP порт. Портът по подразбиране е 8563.
  • --use-version: Това използва специална версия на Arthas
  • --use-http: Това налага използването на HTTP за изтегляне на елементи. По подразбиране се използва HTTPS.
  • --verbose: Това се използва, за да направи кода по-подробен, така че да се отпечата повече информация за отстраняване на грешки.

Използване на терминалната конзола

След като Arthas е готов и работи, можете да щракнете върху Enter, за да преминете към Arthas. След това можете да използвате интерфейса на командния ред, свързан с Arthas, за да въведете някои допълнителни команди във вашия сървър на Arthas. Тук, в примерите, които давам в тази статия, това е локалната машина, така че в резултат на това няма да посочвам --target-ip.

По-долу е даден пример как изглежда терминалът:

Можете да получите допълнителна помощ от вътрешната подкана, като въведете помощ и след това щракнете върху клавиша Enter. Ето резултата за текущата машина:

$ help
 NAME         DESCRIPTION                                                                                                                      
 help         Display Arthas Help                                                                                                              
 keymap       Display all the available keymap for the specified connection.                                                                   
 sc           Search all the classes loaded by JVM                                                                                             
 sm           Search the method of classes loaded by JVM                                                                                       
 classloader  Show classloader info                                                                                                            
 jad          Decompile class                                                                                                                  
 getstatic    Show the static field of a class                                                                                                 
 monitor      Monitor method execution statistics, e.g. total/success/failure count, average rt, fail rate, etc.                               
 stack        Display the stack trace for the specified class and method                                                                       
 thread       Display thread info, thread stack                                                                                                
 trace        Trace the execution time of specified method invocation.                                                                         
 watch        Display the input/output parameter, return object, and thrown exception of specified method invocation                           
 tt           Time Tunnel                                                                                                                      
 jvm          Display the target JVM information                                                                                               
 ognl         Execute ognl expression.                                                                                                         
 mc           Memory compiler, compiles java files into bytecode and class files in memory.                                                    
 redefine     Redefine classes. @see Instrumentation#redefineClasses(ClassDefinition...)                                                       
 dashboard    Overview of target jvm's thread, memory, gc, vm, tomcat info.                                                                    
 dump         Dump class byte array from JVM                                                                                                   
 options      View and change various Arthas options                                                                                           
 cls          Clear the screen                                                                                                                 
 reset        Reset all the enhanced classes                                                                                                   
 version      Display Arthas version                                                                                                           
 shutdown     Shutdown Arthas server and exit the console                                                                                      
 session      Display current session information                                                                                              
 sysprop      Display, and change the system properties.                                                                                       
 sysenv       Display the system env.                                                                                                          
 history      Display command history                                                                                                          
 cat          Concatenate and print files                                                                                                      
 pwd          Return working directory name

От резултата по-горе можем лесно да намерим някои допълнителни команди, които могат да бъдат полезни, когато става въпрос за производствената диагностична страна на Arthas. Сега нека разгледаме някои от тях със следващите редове.

Първо, има командата табло за управление, която предоставя преглед в реално време на текущите нишки на виртуалната машина на Java, използването на процесора, използването на паметта, компютърната архитектура и операционната система, заедно с допълнителна информация, както е показано на следното изображение:

След това командата classloader се използва за показване на информация за зареждане на клас, което се случва за отпечатване на много информация, като например броя на заредените класове и броя на екземплярите. Има повече опции като тази за пълен списък на всички екземпляри на класове (-l) или преглед на йерархията на зареждащия клас (-t).

Освен това има командата jad, която е чудесен инструмент за декомпилиране на клас. Начинът, по който работи, е, че може да ви помогне да намерите точния код на класа, който се изпълнява в производството, така че да можете да сте сигурни, че изпълняваният код е кодът, който всъщност искате да се изпълнява онлайн. Това е сравнително проста команда, следваща името на класа, показано тук: jad java.lang.String. Резултатът от тази команда е, че ще имате клас String, декомпилиран в конзолата.

По-усъвършенстван начин за декомпилиране само на изходния код на класа и записването му във файл на мястото, което сте посочили, би бил следният: jad --source-only java.lang.String > /tmp/String.java. За това тук се използва --source-only за премахване на определени описания за зареждане на класове и местоположение от горната част на декомпилирания клас.

Командата getstatic се използва за показване на стойността на статичното поле на клас. Синтаксисът за него е както следва: getstatic package.to.Class staticFieldName. И ето още един пример: getstatic java.lang.String serialVersionUID, което води до показване на UID стойността на серийната версия на низа, както е показано по-долу:

Командата jvm се използва за показване на пълните резултати на виртуалната машина на Java. След това sc може да се използва за намиране на всички класове, които JVM е заредила, и може също да се чете като клас за търсене. Това е полезно за откриване на проблеми със зареждането на класове.

След това опцията –d отпечатва конкретна информация, свързана с намиращия клас, в който може да има модификатори, анотации, интерфейси или суперкласове с булеви стойности. Те могат да се използват, за да се определи кой клас е. Например, може да определи дали е интерфейс, анотация или изброяване. Ето в изображението резултата от java.lang.String проверка със и без опцията –d:

sc поддържа и заместващи знаци, което може да бъде полезно за изброяване на повече резултати, като например за отпечатване на всички класове, които съдържат определено съвпадение. Можете да го направите със синтаксис като този: sc String*. Вижте примера за изход по-долу.

sm означава метод за търсене и се използва за търсене и преглед на заредени клас методи в конзолата. Опцията –d е особено полезна за тази команда, когато става въпрос за намиране на информация за единичен метод, като модификатори, анотации, параметри, връщани типове или изключения.

Някои допълнителни примери

Можете също да използвате следните команди:

- sm java.lang.String
- sm -d java.lang.String toString

За което ще видите следните резултати:

След това можете също да използвате sysenv, който ви позволява да видите текущите променливи на средата на JVM в конзолата. Можете също да изпълните командата keymap, за да отпечатате текущата клавиатурна карта, както е показано на екранната снимка по-долу:

Друга команда, която можете да използвате често, е thread, която може да се използва за показване на цялата информация за Java нишки в една таблица, както е показано по-долу:

За да видите стека на конкретна нишка, можете просто да следвате команда със съответния идентификатор на нишка, като thread 40, например. Като друг пример, можете да изброите първите 3 най-натоварени нишки с подробно проследяване на стека, като използвате thread -n 3, или алтернативно можете да намерите и изброите всички блокиращи нишки с thread –b. Можете да разгледате този документ за повече информация как работи всичко това и да разгледате някои страхотни опции за отпечатване на подробности за всяка отделна нишка по техния номер, докато сте там.

След това има „watch“, който следи методите на класовете по отношение на връщаните стойности, изключения и параметри. Разгледайте този пример за използване на командата watch. Да приемем, че изпълнявате следното:

watch package.to.*Controller * '{params, returnObj, throwExp}'

В горното първият параметър е името на класа, което поддържа заместващ знак, а вторият е методът. Това също се случва, за да поддържа използването на заместващия знак. Тази команда като цяло отпечатва параметрите в реално време, връща обект и изключения, ако или когато бъдат извикани методи на контролера. Тази команда е доста полезна за отстраняване на грешки.

Забележка:

  • *Controller съвпада с неща като UserController, BillingController, AuthController, IndexController и т.н.
  • Командата watch поддържа опцията -e, което означава, че се откриват само заявки, които хвърлят изключение.

Някои други добри примери за това кога да използвате проекта Arthas-demo са достъпни от документацията.

В интерфейса на конзолата Arthas има поддръжка за набор от функции за автоматично довършване, а също и за навигиране между няколко различни класа пакети в зависимост от това какви думи сте въвели първо, като просто щракнете върху клавиша Tab, за да получите повече предложения.

Изображението по-долу показва предложенията за автоматично довършване, които можете да получите, когато пишете .string.

Командата trace проследява времето за изпълнение на посоченото извикване на метод. Може да бъде полезно да се определят пропуските в производителността, които може да имаме в нашето Java приложение, като се проследява само извикването на метод от първо ниво и не се включват дълбоки проследявания.

Помислете за следното: trace package.to.Class method '#cost > 50'. Този метод ще проследи и отпечата изпълнението на функцията на метода на класа, когато времето е по-високо от 50 ms.

След това командата stack отпечатва пълния стек за извикване на текущия метод. Често знаем, че един метод се извиква, но без никаква представа кой кодов път се изпълнява или кога методът се извиква, тъй като има толкова много кодови пътища към целевия метод. Това е целта на командата стек. Той има доста подобен синтаксис като проследяване, като поддържа и филтриране, с по цена в ms като пример.

Обикновено, ако натиснете стрелките за посока (наляво, надясно, нагоре или надолу) на интерфейса на командния ред, той ще превърти списъка с предишни изпълнени команди.

Командата shutdown се използва за пълно изключване на вашия сървър Arthas и след това излизане от конзолата.

Уеб конзола Arthas

Един от най-популярните начини за взаимодействие с Arthas е чрез командата terminal, както правим в тази статия. Въпреки това, друг начин за взаимодействие с Arthas, разбира се, е чрез използването на неговата уеб конзола в прозореца на вашия браузър.

Уеб конзолата на Arthas комуникира със сървъра на Arthas чрез използване на уеб сокети и може да бъде достъпна на адрес http://server_ip_address:8563/. Не забравяйте, разбира се, да замените rhw server_ip_address в предходния с вашия действителен сървър IP, където сървърът на Arthas е разположен. Ако сте го разположили локално, тогава адресът трябва да бъде 127.0.0.1.

Ето как изглежда уеб интерфейсът:

От горното меню на уеб конзолата можете да видите как можете да се свържете с други сървъри на Arthas, като просто попълните IP адреса и порта на сървъра. По-късно могат да се направят още изследвания, за да стане по-сигурно.

Заключение

В тази статия трябва да научите повече за Arthas, както и как можете да инсталирате и стартирате Arthas. Освен това научихте как можете да изпълнявате някои команди за диагностика на нашите JVM нишки чрез интерфейса на командния ред на Arthas.

Оригинален източник