Обработка потоков в Java-приложении - PullRequest
0 голосов
/ 24 сентября 2018

Я создал службу, в которой запущено 11 запланированных заданий.3 из них запланированы cron заданием (2 из них каждые 15 минут и последний каждую минуту).Эти три задачи предназначены только для мониторинга службы (проверка ehCache и ОЗУ, используемых JVM).Все другие запланированные задачи аннотируются атрибутом fixedDelay, поэтому новый поток следует запускать только в том случае, если последний завершен и прошло x раз, верно?

С http://ask.xmodulo.com/number-of-threads-process-linux.html Я нашелиз-за того, что я могу проверить количество потоков на процесс, выполнив

cat /proc/PID/status

Это привело к следующему

Name:   jsvc
Umask:  0022
State:  S (sleeping)
Tgid:   17263
Ngid:   0
Pid:    17263
PPid:   17260
TracerPid:      0
Uid:    99      99      99      99
Gid:    99      99      99      99
FDSize: 8192
Groups: 99 11332 16600 34691 50780 52730 52823 53043 54173
NStgid: 17263
NSpid:  17263
NSpgid: 17260
NSsid:  17260
VmPeak: 35247540 kB
VmSize: 35232620 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:   5679220 kB
VmRSS:   5663344 kB
RssAnon:         5660016 kB
RssFile:            3328 kB
RssShmem:              0 kB
VmData: 32106616 kB
VmStk:      1012 kB
VmExe:        44 kB
VmLib:     16648 kB
VmPTE:     50908 kB
VmPMD:       128 kB
VmSwap:        0 kB
HugetlbPages:          0 kB
Threads:        19922
SigQ:   0/64039
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000004
SigIgn: 0000000000000000
SigCgt: 2000000181005ecf
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: 0000003fffffffff
CapAmb: 0000000000000000
Seccomp:        0
Speculation_Store_Bypass:       vulnerable
Cpus_allowed:   7fff
Cpus_allowed_list:      0-14
Mems_allowed:  00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000001
Mems_allowed_list:      0
voluntary_ctxt_switches:        5986
nonvoluntary_ctxt_switches:     26

Итак, мой первый вопрос: что такое число «потоков»рассказывая мне?Существуют ли 19922 потока, включающие в себя завершенные потоки, или это только текущие активные потоки?

Я также удивился, почему все эти потоки в настоящее время находятся в состоянии SLEEPING ...

Я сделалграфик (# 1), который отображает текущее количество потоков для этого процесса, и я вижу, что число не только увеличивается.

Graph #1

Так почемуэтот номер такой волнистый?Следует ли удалять подкаталог потока после его завершения?А что с потоками с состоянием "СОН" - они закончили?Потому что мне нечего ждать ...

1 Ответ

0 голосов
/ 25 сентября 2018

Итак, я обнаружил, что

  1. число «Потоки» исключает каждый законченный поток - поэтому все потоки работают или ожидают чего-то.
  2. Это также причинапочему это число колеблется так.

После повторной проверки моего исходного кода я обнаружил, что некоторые объекты ExecutorService закрыты неправильно, поэтому я исправил это и получил следующий график (который выглядит лучше!)

enter image description here

Поэтому, когда у кого-то еще возникают подобные проблемы, я поступил так:

  1. Войдите в систему, гдеприложение работает
  2. Получите правильный PID из процесса, запустив ps -aux | grep -i 'NAME' (замените NAME на правильное имя приложения)
  3. Получите количество запущенных / ожидающих потоков повыполнение cat /proc/[PID]/status

  4. Создать данные графика с помощью for x in {1..100000}; do echo $(date) - $(find /proc/[PID]/task -maxdepth 1 | wc -l); sleep 1; done >> thread_counter.csv

...