Ny设置是:
>星号13.1.0
> Linux 3.13.0-24(Ubuntu Server)
>双插座(Xeon E5-2620)服务器,支持HT – 总共24个核心; 32G RAM
星号用于发送语音消息.我有一个上游SIP提供商,没有硬件电话卡. sip.conf中只允许使用alaw / ulaw.
我使用AMI Originate命令开始通话;然后我在上下文中执行Playback()以发送预先录制的语音消息(本地ext4 FS中的ulaw文件).没有其他与被叫者的交互,没有IVR菜单,没有通话录音.一些非常简单的Perl AGI脚本将调用结果保存到DB(MySQL和MSsql(通过Perl Sybase));通常每个Originate有1-2个AGI呼叫.此外,几乎没有扩展处理 – 字面上为CDR()和几个AGI调用的20行预置标准.我只使用一个AMI连接来启动所有呼叫.
具体是 – 大多数电话都没有回答.我每秒最多拨打50个电话,但实际上只有5-10个电话被接听并收听.
问题是 – 我的cpu使用率非常低,但LA非常高.
如果我发现20-25 cps – 20-24 LA,但是如果我试图将它增加到50cps,那么洛杉矶会爬升到90. ~50LA之后,音质有问题(我可以理解为什么).
大多数Asterisk用户声称他们使用功能较弱的硬件可以获得更多的通话量.
# uptime 12:56:36 up 9 days,15:52,1 user,load average: 32,10,33,45,10 #vmstat -w 1 procs ---------------memory-------------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 3 0 0 30322760 199176 832452 0 0 0 0 237471 38738 5 8 87 0 0 3 0 0 30319148 199176 832500 0 0 0 0 188340 38960 4 6 90 0 0 3 0 0 30325528 199176 832564 0 0 0 26 319903 43916 6 10 83 0 0 105 0 0 30270288 199176 832568 0 0 0 14 175216 39014 4 6 90 0 0 16 0 0 30307908 199176 832572 0 0 0 0 323598 43428 11 12 77 0 0 # mpstat 1 Linux 3.13.0-24-generic (asterisk2) 25.02.2015 _x86_64_ (24 cpu) 13:18:09 cpu %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle 13:18:10 all 5,77 0,00 7,90 0,00 0,17 0,00 86,16 13:18:11 all 5,56 0,00 8,83 0,21 0,00 85,40 13:18:12 all 10,29 0,00 11,42 0,25 0,00 78,03 13:18:13 all 9,70 0,00 10,75 0,00 79,34 # uname -a Linux asterisk2 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux # cat /proc/cpuinfo processor : 0 vendor_id : GenuineIntel cpu family : 6 model : 45 model name : Intel(R) Xeon(R) cpu E5-2620 0 @ 2.00GHz stepping : 7 microcode : 0x70d cpu MHz : 2000.216 cache size : 15360 KB physical id : 0 siblings : 12 core id : 0 cpu cores : 6 apicid : 0 initial apicid : 0 fpu : yes fpu_exception : yes cpuid level : 13 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm arat epb xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid bogomips : 4000.43 clflush size : 64 cache_alignment : 64 address sizes : 46 bits physical,48 bits virtual ... processor : 23 vendor_id : GenuineIntel cpu family : 6 model : 45 model name : Intel(R) Xeon(R) cpu E5-2620 0 @ 2.00GHz stepping : 7 microcode : 0x70d cpu MHz : 2000.216 cache size : 15360 KB physical id : 1 siblings : 12 core id : 5 cpu cores : 6 apicid : 43 initial apicid : 43 fpu : yes fpu_exception : yes cpuid level : 13 wp : yes flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 cx16 xtpr pdcm pcid dca sse4_1 sse4_2 x2apic popcnt tsc_deadline_timer aes xsave avx lahf_lm arat epb xsaveopt pln pts dtherm tpr_shadow vnmi flexpriority ept vpid bogomips : 4001.85 clflush size : 64 cache_alignment : 64 address sizes : 46 bits physical,48 bits virtual # cat /proc/interrupts cpu02 cpu23 0: 24 0 IR-IO-APIC-edge timer 8: 1 0 IR-IO-APIC-edge rtc0 9: 2 0 IR-IO-APIC-fasteoi acpi 16: 33 0 IR-IO-APIC-fasteoi ehci_hcd:usb1 23: 107 0 IR-IO-APIC-fasteoi ehci_hcd:usb2 88: 0 0 DMAR_MSI-edge dmar0 89: 0 0 DMAR_MSI-edge dmar1 90: 1855369 0 IR-PCI-MSI-edge ahci 91: 1 0 IR-PCI-MSI-edge eth0 92: 11296 0 IR-PCI-MSI-edge eth0-TxRx-0 93: 790 0 IR-PCI-MSI-edge eth0-TxRx-1 94: 85066770 0 IR-PCI-MSI-edge eth0-TxRx-2 95: 6851 0 IR-PCI-MSI-edge eth0-TxRx-3 96: 174614 0 IR-PCI-MSI-edge eth0-TxRx-4 97: 4846139 0 IR-PCI-MSI-edge eth0-TxRx-5 98: 136593 0 IR-PCI-MSI-edge eth0-TxRx-6 99: 1294090 0 IR-PCI-MSI-edge eth0-TxRx-7 109: 2 0 IR-PCI-MSI-edge ioat-msix 110: 2 0 IR-PCI-MSI-edge ioat-msix 111: 2 0 IR-PCI-MSI-edge ioat-msix 112: 2 0 IR-PCI-MSI-edge ioat-msix 113: 2 0 IR-PCI-MSI-edge ioat-msix 114: 2 0 IR-PCI-MSI-edge ioat-msix 115: 2 0 IR-PCI-MSI-edge ioat-msix 116: 2 0 IR-PCI-MSI-edge ioat-msix 117: 0 0 IR-PCI-MSI-edge ioat-msix 118: 0 0 IR-PCI-MSI-edge ioat-msix 119: 0 0 IR-PCI-MSI-edge ioat-msix 120: 0 0 IR-PCI-MSI-edge ioat-msix 121: 0 0 IR-PCI-MSI-edge ioat-msix 122: 0 0 IR-PCI-MSI-edge ioat-msix 123: 0 0 IR-PCI-MSI-edge ioat-msix 124: 0 0 IR-PCI-MSI-edge ioat-msix NMI: 3642 1990 Non-maskable interrupts LOC: 53207172 19108700 Local timer interrupts SPU: 0 0 SpurIoUs interrupts PMI: 3642 1990 Performance monitoring interrupts IWI: 804483 60489 IRQ work interrupts RTR: 0 0 APIC ICR read retries RES: 60096784 31495629 Rescheduling interrupts CAL: 4046461325 4101338127 Function call interrupts TLB: 2390847639 1479027286 TLB shootdowns TRM: 0 0 Thermal event interrupts THR: 0 0 Threshold APIC interrupts MCE: 0 0 Machine check exceptions MCP: 2501 2501 Machine check polls ERR: 0 MIS: 0 # atop CPL | avg1 22.45 | avg5 22.65 | | avg15 22.74 | | csw 379728 | intr 1612164 | | | numcpu 24 | MEM | tot 31.4G | free 28.4G | cache 829.3M | dirty 0.0M | buff 194.7M | slab 188.0M | | | | | SWP | tot 32.0G | free 32.0G | | | | | | | vmcom 737.1M | vmlim 47.7G | MDD | md0 | busy 0% | read 0 | write 12 | KiB/r 0 | KiB/w 4 | MBr/s 0.00 | MBw/s 0.01 | avq 0.00 | avio 0.00 ms | DSK | sda | busy 1% | read 0 | write 11 | KiB/r 0 | KiB/w 5 | MBr/s 0.00 | MBw/s 0.01 | avq 1.00 | avio 12.7 ms | DSK | sdb | busy 1% | read 0 | write 11 | KiB/r 0 | KiB/w 5 | MBr/s 0.00 | MBw/s 0.01 | avq 1.00 | avio 11.6 ms | NET | transport | tcpi 1994 | tcpo 2452 | udpi 17159 | udpo 14811 | tcpao 117 | tcppo 1 | tcprs 0 | tcpie 0 | udpip 0 | NET | network | ipi 19235 | ipo 17268 | ipfrw 0 | deliv 19235 | | | | icmpi 7 | icmpo 0 | NET | eth0 0% | pcki 19345 | pcko 17272 | si 3256 Kbps | so 2954 Kbps | coll 0 | erri 0 | erro 0 | drpi 0 | drpo 0 |
你可以看到,cs和vmstat字段中的数字非常高.我无法解释他们.
所以,据我所知 – 有很多线程可以在很短的时间内执行(你可以在vmstat输出中看到一个这样的突发).但是我的设置会导致什么呢?
我试过了:
>在sip.conf中使用编解码器打包(有一个想法,我发送了太多的微包);
>改变播放文件格式;
>完全禁用AGI脚本调用(通过在extensions.conf中注释掉它们);
>改变我使用AMI通道的方式(改变间隔和爆发量以平整负载)
但没有任何帮助.
我检查了我能想到的一切 – 没有磁盘IO,这台服务器上没有其他应用程序.
在mailllist中有些人有类似的问题,但这还没有解决,而且很久以前.
还有一个想法 – 我有一个服务器有相同的问题与非常相似的硬件和Asterisk配置,但有Asterisk 1.8(FreePBX)和CentOS正在使用.我怀疑,这导致了我的特殊用法.
也许,这是AMI的核心问题,我应该使用其他东西进行大规模初始化呼叫?
EDIT1:
这是我的LA图:
EDIT2:这是Asterisk strace.它在高负载时相对相同.我自己不是linux程序员,无法正确解释它.
# strace -f -q -c -p 17150 ^C% time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 42.05 1595.370429 13209 120778 18231 futex 41.21 1563.521630 6304523 248 14 restart_syscall 15.96 605.470340 4726 128105 26 poll 0.23 8.811410 12037 732 nanosleep 0.16 5.903679 26 228693 22073 read 0.15 5.600020 66 85202 write
在一天中间不想要的重启后,我注意到Load Average大幅下降了!我检查了我们的服务器监控系统 – 洛杉矶总是在3-4小时的连续(和稳定)负载中逐渐爬升.这是不明显的,因为我无法在前一天重新启动它.
正如我所说,我有几个Perl脚本,通过AGI()应用程序调用.其中一个叫做h扩展;它只运行一个简单的数据库查询.事实证明,有时DB会有点过载;查询必须等待200-500ms; Asterisk必须等到Perl脚本完成.
所以,我在开始时使用fork()我的Perl脚本 – 立即使AGI()调用返回.这帮了很多忙!洛杉矶变得稳定.这不是一个完整的解决方案 – 它似乎仍然在Asterisk的内部腐败,但速度慢得多,这几乎不是问题.
对于那些寻求准备使用的代码片段(不要忘记在fork()之前获取所有变量,因为您将无法访问$AGI之后):
my $AGI = new Asterisk::AGI; # get all your variables here my $var = $AGI->get_variable('var'); undef $AGI; if (fork) { exit 0; }; open STDIN,'<','/dev/null'; # dont forget to free your parent's file handles open STDOUT,'>','/dev/null'; open STDERR,'>&STDOUT';
这似乎是一个错误 – 但我想知道为什么除了我以外没有其他人有这样的问题.
编辑1:嗯,消除AGI调用后问题完全消失了.我只做了几个自定义ODBC函数(func_odbc.conf),它只保存异步处理的信息(稍后由单独的perl守护进程处理).洛杉矶从20-25下降到0.5-0.9(!).我从未想过AGI会造成如此巨大的负担.