2012年2月29日星期三

HTB的原理

定义:

1. Class有 AR(assured rate),CR(ceil rate),priority,level和quantum Q。Class可以有parent。class的当前流量是R,对于inner class(非叶子节点),它的R是所有叶子节点的R总和。

2. Leaf是没有孩子的class,只有Leaf才有包队列。

3. Level是class在树形结构所在的层次,leaves的level是0,root是LEAVEL_COUNT-1,每个inner class的level比父节点的level要少1。

4. class的Mode可以根据R, AR, CR计算出来:
 
     -  Red: R > CR,当前流量超过最高的流量限制
     -  Yellow:  R <= CR and R > AR,当前 流量比保证的流量限制要高,但比最高的流量限制要小。
     - Green:  R <= AR

5. D(c)是所有的叶子节点,这些叶子节点都需要从c来借流量(对应上面的Yellow Mode)。

链路分享的目标:

c是class, p是parent


Rc = min(CRc, ARc + Bc)        [eq1]


Bc是指从父节点借的流量,如果没有父节点,那Bc就是0;如果有p的其他叶子节点需要借流量,并且优先级要比当前class的优先级高(数值低),那么当前的class就不应该被服务,Bc也是0;如果轮到当前的class,那么综合和当前class同一优先级的class,以这些class的Q(quantum)为权重来分配剩余的流量Rp。


       Qc Rp
Bc = -----------------------------  iff min[Pi over D(p)]>=Pc  [eq2]
     sum[Qi over D(p) where Pi=Pc]

Bc = 0   otherwise      [eq3]
 
 
 

修改wifi信号以避免干扰

家用的无线网络基于802.11b或802.11g标准,信号传输的频率范围是2.4G Hz,家用的很多其它设备,比如无绳电话,微波炉等,都可能使用同样的频率范围,这些都能够影响wifi网络,造成传输速率的降低和网络连接的中断。邻居家的wifi信号也同样可能会影响你家的。

2.4G Hz的频率范围被划分为很多band(channel),类似于电视的频道(channel)。在大多数国家,wifi设备提供了一些可选择的channel,合理的选择channel能避免干扰的影响。美国的设备有11个channel,channel 1使用最低的频率,后面的channel的频率依次递增,默认的channel是6,离得越远,干扰越小。

2012年2月28日星期二

IMQ和IFB

IMQ - Intermediate Queueing Device

作用:

1. Ingress的整形。linux只能在egress做整形。

2. 同时对多个接口做整形。qdiscs只能附加到一个设备上,有时需要设置全局的限制。

IFB - Intermediate Functional Block Device,作为IMQ的替代品,实现更简单,只有200行代码。可以将其他接口的流量重定向到这个接口,来做同一的整形控制,并且能支持(Ingress)下行流量的整形。

如果板卡出现了莫名其妙的错误,你可能需要关注中断资源哦[转]

        因为用的Asterisk板卡太多,电脑的升级换代速度又如此之快的原因吧,经常遇到一些稀奇古怪的问题。中断资源(IRQ)问题是其中一个重要的值得关注的问题。
1、什么是中断IRQ(温习一下计算机原理课程)
        IRQ 为 Interrupt ReQuest的缩写,中文译为中断请求。因为计算机中每个组成组件都会拥有一个独立的IRQ,除了使用PCI总线的PCI卡之外,每一组件都会单独占用 一个 IRQ,且不能重复使用。 注意,这段话说明,PCI总线的PCI卡喜欢分享中断,而不是独占——这就是隐患所在。
        中断的工作原理是:由于在计算机运行中,CPU是持续处于忙碌状态,而当硬件接口设备开始或结束收发信息,需要CPU处理信息运算时,便会透过IRQ对 CPU送出中断请求讯号,让CPU储存正在进行的工作,然后暂停手边的工作,先行处理周边硬件提出的需求,这便是中断请求的作用。
   
在 每个系统中会有两颗芯片来提供16个IRQ(资源有限啊),其中大多的IRQ都有固定的编排,比如 IRQ 0固定为系统定时器,IRQ 1则是键盘,IRQ3和IRQ4是给串口用。因为每一个IRQ只能让一种设备使用,而IRQ数目又十分有限,若计算机安装很多的配件,IRQ势必就会不敷 使用,所以可能会发生两个设备共占同一个IRQ的现象,此时也就会出现IRQ冲突问题,造成该设备无法使用。
   
最简单的解决方法就是到操作系统的硬件设备管理器中去手动调整IRQ的分配,或是在BIOS中作调整。如果是IRQ不敷使用的情形,可以利用其它的方式来解决此一窘境,像是PCI总线可以共享一个IRQ,所以基本上可以采增加PCI插卡的方式,就不会被IRQ 所限制。

2、Asterisk板卡的中断原理
        Asterisk卡是每秒钟发生1000次中断的,每片卡每1ms申请一次中断。(现在新的卡已经可以调中断次数了)。其他语音卡也是类似的,中断次数可能各家不一样。
        如果发生的中断次数少于1000次,就是Asterisk中断丢失.。你可以通过用'zttool',查看卡是否发生了中断丢失。
        虽然IRQ缺失不会导致报警,但是发生IRQ缺失会出现一些症状,会导致Asterisk不同的问题发生:比如出现很差的声音质量或者PRI错误,DTMF检测不能正常工作等。

3、为什么我的卡有IRQ中断丢失?
     
        导致IRQ丢失的一些常见的原因如下:
                -运行 X window system
                -共用了IRQs
                -没有硬盘驱动器的DMA
                -硬盘驱动器的DMA太高(达到udma3)
                -运行串行终端或帧缓冲器

        对于IRQs共用情况,可以用下面的命令来检查:
                  cat /proc/interrupts CPU0
引用
      
      
      
      
      
      
0  10756672XT-PIC timer
2  0       XT-PIC cascade
5  10812879XT-PIC uhci_hcd, uhci_hcd, wctdm
10 226219  XT-PIC t1xxp, CS46XX
11 1550046 XT-PIC eth0, nvidia
12 387234  XT-PIC i8042
14 32641   XT-PIC ide0
15 18      XT-PIC ide1
NMI0      
LOC10757616
ERR40481  
MIS0      

         在这里您可以看到T100P卡和声卡共用了IRQ,TDM400P卡和USB controller共用了中断。这样很有可能会出问题。如果你不用USB设备倒是没什么。但是最好是disable USB或者让有自己单独的IRQ。

4、怎样解决Asterisk语音板卡的IRQ中断丢失问题
        有以下几种方法让板卡有自己的IRQ:
                -Turn on APIC
                -Tweak BIOS settings
                -Try a different PCI slot
                -Use setpci
        解决中断冲突的常见方法有:
        1、调整硬件,能不用的尽量不接到电脑上。常用来解决中断冲突造成的死机和较难排除的IRQ冲突。这个办法就是在主板BIOS默认的IRQ资源分配下,通过调整板卡(声卡、Modem、网卡、电视卡、显卡等)于插槽的安装位置来避开IRQ冲突。
        2、在BIOS里做设置,对于某些不太严重的冲突,可以通过调整BIOS设置的软着陆办法,通过调整BIOS中的“PNP/PCIConfiguration”设置项,重新分配IRQ资源,以避开IRQ冲突。

这里有一个英文的:

Verify that your Digium hardware is not sharing an IRQ on your
system. You can accomplish this by running "cat /proc/interrupts". Do
not solely rely on "cat /proc/interrupts" to determine whether your
Digium hardware is sharing an IRQ on your system. Make sure your Digium
hardware is on its own IRQ by itself and that it is taking interrupts.
You can determine whether it is taking interrupts from the 2nd column of
output from "cat /proc/interrupts". This should be something other
than zero. You will also need to verify that your Digium hardware is
not sharing an IRQ by examining the output after running"lspci -v" and
"lspci -vb". Using lspci is the best way to determine whether or not
your Digium hardware is sharing an IRQ on your system. Please verify
that all Digium hardware is on its very own IRQ by itself. You may need
to disable unnecessary hardware on your machine such as sound
controllers, USB controllers, extra ethernet controllers, firewire,
parallel ports, and/or serial ports. You should try moving and swapping
the Digium card to different PCI slots in order to get it on it's own IRQ.
Some BIOS's will allow you to specify an IRQ for each PCI slot and/or
onboard devices.

If you are running an IDE hard drive please verify that you are using
DMA mode with a UDMA setting of no lower than 2 or higher than 3. UDMA
mode 2 is ATA33. UDMA mode 3 is ATA44. This can be done using hdparm.
Digium suggests using "hdparm -d 1 -X udma2 -c 3 /dev/IDE Device". You
can check the status using "hdparm /dev/IDE Device" and "hdparm -i
/dev/IDE Device". If you make modifications to your IDE hard drive
settings they will only be kept until you reboot. You will need to add
the hdparm command you executed to one of your distribution's startup
scripts. This way the IDE hard drive settings will be updated on each
reboot.

You can check whether or not your Digium hardware on your system is
experiencing IRQ misses by using the zttest application which should be
located in yourzaptel source directory. Do not solely rely on zttest to
determine whether you are having IRQ misses with your Digium hardware on
your system. Optimally, we are looking for output of 100% from zttest.
Digium cards will function properly as long as they do not report back less
than 99.98%. Some people have reported no apparent problems with output
as low as 99.975%, while others will have many apparent problems with an
output as low 99.975%. You are almost guaranteed to have many apparent
problems with an output lower than 99.975%. Digium strongly suggest doing
everything possible in order to obtain at least 99.98% output from
zttest. I would watch the output over a 5 minutes period to check for
spikes on intervals. You may also look for IRQ misses using the zttool
application. Do not solely rely on zttool to determine whether you are
having IRQ misses with your Digium hardware on your system. This
application should be built while compiling zaptel. zttool requires the
libnewt development package to be installed on your system in order to
compile properly.

IRQ misses with your Digium hardware can be due to I/O problems on your
system. You may test if you are having I/O problems on your system by
running "hdparm -t /dev/Hard Drive Device". This will causes massive
amounts of I/O on your system. The symptoms of an I/O problem on your
system could be cracklingand/or static on the line while running "hdparm
-t /dev/Hard Drive Device". If you are having an I/O problem on your
system and run this command it could result in dropped calls
temporarily. If you are experiencing those symptoms while running
"hdparm -t /dev/Hard Drive Device" it is likely that you havean I/O
problem on your system. We would suggest using an IDE harddrive rather
than SCSI or SATA in order to configure your hard drive to UDMA2.
Configuring a SCSI or SATA hard drive to UDMA2 is not possible. This is
only possible on an IDE hard drive. Do not solely rely on "hdparm -t
/dev/Hard Drive Device" to determine whether or not you have an I/O
problem on your system.

        Please ensure that you are not running X-Windows, frame-buffer, or
serial console, as these will cause problems with our hardware. You can
disable frame-buffer by supplying the "vga=normal" option to your kernel
at boot time. Frame-buffer may start your console with a high
resolution and a logo that is alongthe top of the screen.

        如果还有中断丢失问题,你可以设置启动kernel的时候设置参数为 "acpi=off" 和/或者"noapic" ,这样可以禁用ACPI(电源管理)。这个也是常见的中断共享来源之一。

        如果你的系统支持超线程(Hyper-Threading),你可以尝试在BIOS里面关掉它,看看是否会对中断冲突问题有改善。

http://www.51asterisk.com/read.php?tid=506&fpage=2

Asterisk如何判断模拟卡线路上的占线忙音和拆线音(挂机)[转]

       FXO端口(外线,O口,中继线,模拟线,电话线,红模块)用在非北美地区的模拟线路上时,通常用的是loopstart信令,靠识别来自FXS的有特定的频率和特殊的通断比的规律声音(信号音)来判断线路的状态(使用中/已挂机/用户闲)。
        由于包括中国在内的很多发展中国家的国情现状,很多地区的信号音是非标准的。下面我们以中国为例,介绍Asterisk如何判断模拟卡线路上的状态。
1. 标准的信号音
        在中国,规范的忙音信号应该是(0.35秒通,0.35秒断,声音频率是450kz)。Asterisk在indications.conf对cn(中国)的定义就是如此:
引用
[general]
country=cn
....
[cn]
ringcadence = 1000,4000
dial = 450                                                  ;拨号音
busy = 450/350,0/350                                ;中国忙音标准
ring = 450/1000,0/4000                              ;振铃音
congestion = 450/700,0/700                       ;拥塞音
callwaiting = 450/400,0/4000                       ;呼入等待音
dialrecall = 450
record = 950/400,0/10000
info = 450/100,0/100,450/100,0/100,450/100,0/100,450/400,0/400
stutter = 450+425

        拨号音:(450Hz,-10±3dBm0,连续)——“嗡…”的连续音。
        忙音:(450Hz,-10±3dBm0,0.35s on/0.35s off)——“嘟,嘟,嘟…”短促音(响0.35秒,断0.35秒)。
        拥塞音:(450Hz,-10±3dBm0、0.7s on/0.7s off)——这是一种“嘟,嘟…”的短音(响0.7秒,音隔0.7秒)。拥塞音有点像忙音,但比忙音声音要长,它表示程控交换机因某种原因机线拥塞不通。
        呼 入等待音:(450Hz,-20±3dBm0、0.4s on/4.0s off)——在用户登记了“呼叫等待”服务项目后,如果该用户正与对方通话时,又有第三者呼叫该用用,则该用户在受话器中会听到一种微弱的信号音,这种信 号是“嘟…”的短促音(响0.4秒,音隔0.4秒,再响0.4秒)。它表示有第三者在呼叫,提醒该用户是否要与第三者通话。
        特 种拨号音: (450Hz,-10±3dBm0,0.4s on/0.04s off)这是一种“嘟,嘟…”的一短一长的声音,当用户的电话中登记了某种程控电话服务项目后,摘机听到的拨号音就是这种特种拨号音,用以提醒该用户。这 种拨号音不妨碍该用户打电话,只要在规定产时间(5秒)内拨号即可。
        二次拨号音:(400Hz,-10±3dBm0、连续)
        回铃音:(450Hz,-10±3dBm0,1.0s on/4.0s off)——“嘟,嘟…”的断续音(响1秒,断4秒)表示用户拨叫的对方电话已接通,正在振铃。  
        空 号音:(450Hz,-10±3dBm0、0.1s on/0.1s off/0.1s on/0.1s off/0.1s on/0.1s off/0.4s on/0.4s off)--“嘟、嘟、嘟-”的450赫的三短一长音(短音为0.1秒,间断0.1秒,长音为0.4秒)
        三方通话提醒音:(950Hz,-20±3dBm0、0.4s on/10.0s off)
        催挂音:(950HZ 0.4dB)——当用户用完电话,没有挂机或话机手柄没有放好时,程控电话局会发出一种由小逐渐变大的连续音(950HZ),提醒该用户把话机挂好。
        长 途通知音:(450Hz,-10±3dBm0,0.2s on/0.2s off/0.2s on/0.6s off)——当用户在市内电话通话过程中,又听到“嘟,嘟”声,跟着一小段间歇,又再“嘟,嘟”,这样的短音(响0.2秒,断0.2秒,音隙0.6秒)就 是“长途电话通知音”,告诉用户有人工长途电话要和您通话,请尽快结束市内通话,准备接听长途电话。这种长途电话通知音随着我国长途电话自动化的普及也越 来越少了。

2. 非标准信号音的处理
  事实上,除了一些大城市的固网电信公司交换机能够提供标准信号音外,由于中国电信经过很长时间的七国八制的盲目发展阶段,很多地方的信号音是不标准的。
        如果电信公司给你的忙音信号根本就是不标准的,Asterisk怎么可能识别呢?必然出现无法正确判断拆线的状况。
        这 种情况下,就得通过ztmonitor录音后,判别它通断比,然后将这些数值填入zapata.conf的busypattern 中,然后重启asterisk服务器(例如beep持续600号码,静音400毫秒,那么busypattern=600,400)
  在中 国,Asterisk的zapata.conf需要启用busydetect=yes,以及busycount=6可以解决大多数忙音识别和无法拆线的问 题(基于loopstart),zapata.conf(或zapata-channels.conf)设置如下:
引用
busydetect=yes
busycount=6                          ;设置的值过小会引起通话中中断的故障
....................
loadzone = cn
defaultzone = cn

        提 示:不要盲目按照某些技术帖子所说的,随便增加busypattern这个参数。除非你明确知道这么作的原因。没有这个参数,Asterisk接受任何有 规律的断通信号在busycount规定的次数内判别为忙音。如果busy tone的通断间隔不相等(如前文提到的beep 600毫秒,静默400毫秒),才需要手工设置.
  如果上述设置在你的机器上不生效,请检查线路质量,检测是否有回声,有的时候线路的杂音会干扰到Asterisk的忙音识别。

3. 极性反转信号(反极信号)
        如果是话务量比较密集的应用或对计费数据比较敏感的环境,建议去电信申请反极信号(反极信号就是极性反转信号,跟kewl start不是一回事)。同时在zapata.conf中增加:
引用
hanguponpolarityswitch=yes ;拆线
answeronpolarityswitch=yes ;对端应答(用于计费)

        这两个设置不要和busydetect=yes或callprogress=yes同时使用。

4. 小技巧: 如何确定自己的线路是否支持kewlstart
        将 一个支持拨号盘高亮的(不需要外接电源,直接从市话取电)的普通模拟电话机连接到PSTN线路上,拨通你的手机,接听手机,然后手机挂机。如果那部模拟电 话机在远端(手机)挂线后拨号盘灯熄灭(drop battery),那么这条线路是支持kewlstart的,不需设置busyXXX和callprogress。
  不要把callprogress和busyxxx属性混用,这是两种不同的工作方式.目前默认工作方式的callprogress仅对北美生效。

Asterisk模拟卡的馈电、铃流[转]

1. 馈电

        俗称供电。馈电方式有电压馈电和电流馈电两种。所有连接在交换系统的终端,都是由交换机向其供电。
        用户挂机状态下,程控交换机的馈电电压在直流48V,电流应该在5微安左右。
        通话时,馈电电流在20毫安—50豪安之间,电压下降到7-10V。
        而小型集团电话交换机(用户小交)的馈电电压在30V左右,馈电电流在20毫安—30毫安之间,这就是为什么程控交换机比集团电话传输距离更远的原因之一。
        而 Asterisk语音卡的FXS端口一般都采用计算机内置的12V直流电源作为馈电电压,馈电电流在20毫安之内,这也就是Asterisk系统无法支持 远距离传输的原因。无法支持远距离传输,也就不可能支持超大型厂矿企业的上千线电话分机的应用了(符合SMB的定位)。

2. 振铃

        振 铃电压较高,国内交换机一般为交流90V左右,频率为16-25Hz。通常采用继电器来控制铃流接点。振铃是由交换机系统来控制,当需要振铃时,发出控制 信号,是继电器闭合,振铃电路发出铃流信号至用户。当用户摘机时,摘机信号由振铃监视电路检测,立即切断振铃,提供馈电电流(通常叫做自动截铃)。有些集 团电话和PBX的这部分功能由高压电子器件实现,取消掉了继电器。
        Asterisk模拟语音卡的S口模块能够提供的馈电和铃流电压都比较低。

3. 常见问题
        如果一个正常运行的系统突然发现无法对电话机振铃或电话机摘机起来没有拨号音,可能是:
        . Asterisk模拟接口卡的电源接口松了,重新接一下。
        . FXS接口模块(绿模块)坏了,需要更换。

http://www.51asterisk.com/read.php?tid=634 

Asterisk模拟卡的FXO(外线)和FXS(内线)端口详解 [转]

1. 模拟卡接口
        模拟卡端口只有FXO(外线)和FXS(内线)两种类型,有时,也把FXO叫做模拟中继接口或外线模块,把FXS叫做坐席接口或坐席模块或内线模块。
        FXO-Foreign Exchange Office,以下简称O口。
        FXS-Foreign Exchange Station,以下简称S口。
  两者的差别就是S口提供电压(实现馈电和铃流),而O口不提供。家里用的普通电话机就是一个典型的FXO设备。
  在现实世界中,S口和O口总是成对出现的.由S口向O口馈电(提供电压),振铃;FXO向FXS传送号码(DTMF/FSK).所以对接时会出现fxs侧的用户需要首先呼叫到fxo,再二次拨号呼叫到被叫侧,而fxo侧用户可以一次直接呼叫被叫用户(一次拨号)。

2. Asterisk模拟卡接口
  Asterisk模拟卡无论4线,8线,12线,16线,24线或其他规格,其端口也只有S和O两种类型。也有人根据直观颜色,把FXO叫做红模块,FXS叫做绿模块,因为大部分Asterisk板卡厂家的FXO模块都是红色外观,而FSX模块都是绿色外观。
        在Asterisk中,FXO接口接受的是fxs信令和FXS提供给fxo信令.所以你在zapata中看到fxsXX(ls,gs,ks) 这个端口是FXO接口,如果是fxoXX(ls,gs,ks) 这个端口是FXS接口.
  FXO用于连接PSTN(因为PSTN测其实是一个S口,向Asterisk的FXO接口馈电)
  FXS用于连接普通电话机,因为Asterisk通过FXS接口向电话机(还记得吗?我们刚刚说过普通电话机是一个FXO设备)提供馈电。这也是为什么Asterisk模拟卡上如果有FXS模块的需要外接电源的原因。因为只有外接电源才让FXS能向外提供馈电和铃流。
  倘若Asterisk系统位于企业用户小交交换机(PBX)的后面,那么Asterisk的FXO接口和PBX的模拟分机口相连,asterisk的FXS接口和PBX的模拟中继端口相连。


http://www.51asterisk.com/read.php?tid=633

Asterisk模拟线FXO的主叫号码识别(来电显示)[转]


       CID (CallerID,CLID,主叫号码,来电显示)是在实际使用中常遇到的另外一个常见问题,主叫号码格式分为FSK(美规)或DTMF方式。主叫号码可能会在第一声振铃之前送过来,也可能在第一声振铃之后,第二声振铃之前发送过来。

1. 如何确定CID的制式
        最简单是拿原来可以支持来显的电话机来看(必须是有时间显示的电话机)。
        1、先把机器的时间调乱.(随便调,但月份一定调)
        2、然后用自己的手机打进去,电话响5声后挂掉,不要接。
        3、然后看时间自动改过来了没.
        如果是改过来了(年份不改不要紧,但月份一定要),那证明是FSK制式。如果没改过来那就是DTMF制式。

2. 区分FSK的制式
        区分了fsk之后,如果在第一声之前,就显示了号码,那么就是欧式的FSK;如果在第一声和第二声之间才显示来电号码,那么就是美式的FSK。

3. 主叫号码的制式与运营商和地区的关系
        主叫号码的制式与运营商(是南方电信还是北方网通,联通,或者是铁通)关系不大。即便是同一个城市的同一个运营商,也可能提供两种制式的主叫号码,这主要取决于电信交换机。

4. Asterisk对主叫号码制式的支持
        Asterisk 是美国人做的,所以对FSK制式的支持相对比较好,但是如果遇上DTMF制式的主叫号码,确实挺麻烦的。解决办法有两个,一个是花50块钱买个转换器(就 是那个DTMF转FSK的)或修改驱动程序来解决。可以参照OPENVOX的方法,修改两个文件并重新编译zaptel驱动,将OPENVOX的 wctdm.c覆盖掉,opvxa1200.c里面的……。
        在后面的文章中,我们会专门针对DTMF制式的主叫号码识别做专文介绍。

5. 小知识:什么是FSK
        FSK(Frequency- shift keying):频移键控,是信息传输中使用得较早的一种调制方式,它的主要优点是:实现起来较容易,抗噪声与抗衰减的性能较好,因此在低速数据传输中得 到了广泛的应用。以前有一个叫做固网短信的业务,就是利用了FSK技术来传递短信息的。
        FSK也有很多标准,中国、美国、澳大利亚采用的bellcore标准(贝尔202 / V.23)。  

loop start,kewl start,grand start[转]


模拟线路信令模式loop start,kewl start,grand start

        模拟线路信令模式有loop start,Kewl start,grand start等三种。
  这三个术语很专业了。普通用户不需要了解很多。
        grand start是需要专门申请的,一般用于中继线(它的好处就在于可以避免进线和出线的碰撞,提高线路使用率),在Asterisk中用不到,如果你不知道它是什么,忘了它吧,你不会用到它的。
        而 普通的电话线路一般是loop start的,Asterisk推荐的kewlstart也是一种loop start,只不过它能识别supervisor disconnect信号(就是远端拆线后在发送忙音之前,发送这个信号。所以如果你的局端提供的是kewlstart信号,Asterisk默认的配置 可以很正确的识别远端拆线,这也就是为什么默认的zapata.conf中不启用busydetect的原因)。
        在中国大陆,主要采用的是loop start,而北美采用的是kewlstart。
   所以当你正确安装了卡板和驱动,但用默认的fxsks信令,拨号到pstn得到"all circuit busy now"的提示语时,尝试将zaptel.conf和zapata.conf中默认的fxsks改为fxsls (修改完毕后需要重启机器而不是单纯重启asterisk)。

        在北美,模拟卡应用很少出现问题,就是因为信令是 kewl start,而其他地区因为信令是loopstart,完全靠模拟信号音而不是相对准确的电压来判断摘挂机,所以很容易出现问题。所以如果遇到模拟线路的 信令问题是,最好向电信公司申请极性反转信号……  

原文地址:http://www.51asterisk.com/read.php?tid=635

2012年2月26日星期日

tc-sfq

Stochastic Fairness Queueing (SFQ) 是公平队列算法的一个简单实现,它准确度不高,但计算开销也比较小,也能够保证公平。

SFQ为每一个会话(TCP或UDP)提供一个FIFO的队列(这里的会话通常是[source address, destination address, source port ]),然后每个队列采用round robin的方式去发送数据。实际的实现并不会为每个会话提供一个队列,而是采用hash算法将流量分配到有限的几个队列中,这时,多个会话可能会分到同一个queue中,降低各种发包的机会(减少了速率),为了避免这种情况,SFQ会动态的调整hash算法,减少出现这种冲突的时间,在调整过程中,可能会出现包乱序的情况。

SFQ只进行调度,并不进行流量整形。并且需要保证拥塞的队列是在当前配置策略的机器上,即如果拥塞地方在其他的链路则没有效果。SFQ通常和其他的classful的qdisc如HTB一起使用。

参数:

perturb - hash算法重新调整的时间间隔,建议值10秒。

quantum - round robin每一轮可以发送的字节数,不能比MTU小。

limit - SFQ队列缓存的包个数,超过了就开始丢弃,默认128个包。

例子:


# tc qdisc add dev ppp0 root sfq perturb 10
# tc -s -d qdisc ls
qdisc sfq 800c: dev ppp0 quantum 1514b limit 128p flows 128/1024 perturb 10sec 
 Sent 4812 bytes 62 pkts (dropped 0, overlimits 0) 

800c是自动指定的handle id,队列长度限制为128个包

tc-pfifo,tc-bfifo和pfifo_fast

这三种都是classless的Queuing Discipline。classless的qdisc可以用来对特定的接口进行总的限制,不能划分子类,但可以应用在子类上。

Linux默认的qdisc是pfifo_fast,这种fifo有三个队列,FIFO0,FIFO1,FIFO2,对应的优先级分别从高到低,分为3个band,0最先调度,0处理完后,其次是1,然后是2,优先级对应于包内的ToS字段,那些需要最小时延的包会被放到band0中。

ToS和band之间的映射关系如下:


TOS     Bits  Means                    Linux Priority    Band
------------------------------------------------------------
0x0     0     Normal Service           0 Best Effort     1
0x2     1     Minimize Monetary Cost   1 Filler          2
0x4     2     Maximize Reliability     0 Best Effort     1
0x6     3     mmc+mr                   0 Best Effort     1
0x8     4     Maximize Throughput      2 Bulk            2
0xa     5     mmc+mt                   2 Bulk            2
0xc     6     mr+mt                    2 Bulk            2
0xe     7     mmc+mr+mt                2 Bulk            2
0x10    8     Minimize Delay           6 Interactive     0
0x12    9     mmc+md                   6 Interactive     0
0x14    10    mr+md                    6 Interactive     0
0x16    11    mmc+mr+md                6 Interactive     0
0x18    12    mt+md                    4 Int. Bulk       1
0x1a    13    mmc+mt+md                4 Int. Bulk       1
0x1c    14    mr+mt+md                 4 Int. Bulk       1
0x1e    15    mmc+mr+mt+md             4 Int. Bulk       1


包结构,TOS字段4bit,另外后面还有1bit,总是0:

   0     1     2     3     4     5     6     7
+-----+-----+-----+-----+-----+-----+-----+-----+
|                 |                       |     |
|   PRECEDENCE    |          TOS          | MBZ |
|                 |                       |     |
+-----+-----+-----+-----+-----+-----+-----+-----+


4bit ToS字段:

Binary Decimcal  Meaning
-----------------------------------------
1000   8         Minimize delay (md)
0100   4         Maximize throughput (mt)
0010   2         Maximize reliability (mr)
0001   1         Minimize monetary cost (mmc)
0000   0         Normal Service
 
 
pfifo_fast的队列长度不能通过tc命令设置,只能通过ifconfig设置整个接口的队列(见下面的说明) 




另外还有两种先进先出的排队策略,一种是pfifo,按包的个数限制队列长度,另一种是bfifo,按字节数来限制队列长度

tc qdisc ... add pfifo [ limit packets ]

tc qdisc ... add bfifo [limit bytes]

使用这个来代替默认的qdisc的原因是,他们有统计信息。

参数: limit,默认pfifo的值是txqueuelen,这个可以通过ifconfig或ip命令来指定,txqueuelen是设备中的传输队列,通常在慢速连接上会设置比较小的值,防止突发的流量导致接口这里出现长时间的拥塞,造成时延增大,影响交互应用;默认bfifo的值是txqueueulen * MTU。

要设置txqueuelen,可以使用ifconfig:

ifconfig eth0 txqueuelen 10

可以使用下面的命令来查看接口的网络统计信息:


# tc -s qdisc ls dev eth0
qdisc pfifo 8001: dev eth0 limit 100p
 Sent 45894 bytes 681 pkts (dropped 0, overlimits 0)

2012年2月21日星期二

tc-htb限速

HTB - Hierarchy Token Bucket,从字面意义上上,这个是分层次的,HTB的规则本质上是一个树形结构。HTB可以用来在一个物理链路上虚拟多个链路,并能合理的利用空闲带宽,限速的原理和TBF是一样的。HTB比CBQ更加灵活,但是CPU开销也更大,通常高速的链路会使用CBQ,一般而言HTB使用的更加广泛,比HTB更加强大的是HSFC,原理一样,但是有更多的功能。

如果将HTB的分层结构看作树,那么每个节点就被称为一个class,每个class可以设置一个qdisc,默认的是tc-pfifo。 另外HTB还可以设置一些过滤器,通过这些过滤器可以将到来的包分发到指定的class上。这里过滤器通常挂载在root节点(egress接口),但匹配只能匹配叶子节点。

HTB是属于classful的qdisc,这类classful的qdisc可以使用filter来将包指定到特定的队列。classful的qdisc的子class只能是同类型的classful qdisc,或者是classless的qdisc,即HTB的子class只能用HTB或其他的classless的qdisc,如pfifo或者


tc qdisc ... dev dev ( parent classid | root) [ handle major: ] htb [ default minor-id ]



 Qdisc的参数:  

parent major:minor 或者 root。 一个qdisc是根节点就是root,否则其他的情况指定parent。其中major:minor是class的handle id,每个class都要指定一个id用于标识。

handle major: ,这个语法有点奇怪,是可选的,如果qdisc下面还要分类(多个class),则需要指定这个hanlde。对于root,通常是"1:"。

注意:对于tc命令中的qdiscs和classes,标识handle(classid)的语法都是x:y,其中x是一个整数用来标识一个qdisc,y是一个整数,用来标识属于该qdisc的class。qdisc的handle的y值必须是0,class的handle的y值必须是非0。通常"1:0"简写为"1:",也就是上面看到的写法。

default minor-id,未分类(不能和filter匹配)的流量(默认的)会被送到这个minor所指定的类(class id为major:minor-id),默认不指定就为0,即按物理链接的速率去发送。



tc class ... dev dev parent major:[minor] [ classid major:minor ] htb rate rate [ ceil rate ] burst bytes [ cburst bytes ] [ prio priority ]

 Class的参数:

parent major:minor,指定这个类的父节点,父节点可以是Qdisc,也可以是Class,如果是Qdisc,那么就不用指定minor,这个是必须的参数。

classid major:minor,classid作为class的标识,这个是可选的。如果这个class没有子节点,就可以不指定。major是父qdisc的handle。

prio 低优先级的class会优先匹配  

rate 这个class和其所有子类的速率

ceil 如果父类有空余带宽,最高可以分配给当前class的值,默认是和rate一样。

burst 允许以ceil的速率发送的字节数,应该至少和子类的burst最大值一样。  

cburst 允许以网口的最高速率发送的字节数,应该至少和子类的cburst最大值一样。功能类似tbf中的peakrate,当这个值限制很小时,可以避免突发的流量,以避免瞬间速率超过ceil。


quantum 每轮当前的class能发送的字节数,quantum = rate / r2q.  Quantum必须大于MTU(默认1500) 小于 60000。quantum只在class的流量超过了rate但是没超过ceil时使用。quantum越小,带宽共享的效果就越好。


r2q 用来计算quantum,r2q默认是10。Quantum设置的比MTU小会导致速率统计偏小,因为这种情况下速率计算的单位是Quantum,而不是真正发生的数据量。



例子:网络拓扑如下,有两个客户A和B,给B分配60kbps的带宽,给A分配40kbps的带宽,其中有30kbps分配给WWW,剩余的带宽分配给其他应用。下面的每一个节点都对应HTB中的一个class,当某个class没有用完分配的带宽,这些剩余的带宽可以分配给其他应用。

                        Main Link
                                | 100kbps
             --------------------------
              |  30kbps    |  10kbps   | 60kbps
       A/www         A/others       B

首先第一步先添加一个root的qdisc,为接口eth0指定HTB的qdisc,并用handle 1:来标识,default 12是指如果包没有匹配到接下来任何一个class,那么就放到默认的minor id为12的class中(classid 为 1:12)。

tc qdisc add dev eth0 root handle 1: htb default 12

接下来再为root的qdisc划分多个分类:

tc class add dev eth0 parent 1: classid 1:1 htb rate 100kbps ceil 100kbps
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 30kbps ceil 100kbps
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 10kbps ceil 100kbps
tc class add dev eth0 parent 1:1 classid 1:12 htb rate 60kbps ceil 100kbps

第一行创建了"root" class,父节点是"1:",root class下面的class之间是可以共享带宽的,直接把下面三个class挂载到"1:"也是可以的,但是它们之间就不会共享带宽了。

#不共享带宽

tc class add dev eth0 parent 1: classid 1:1 htb rate 30kbps ceil 100kbps
tc class add dev eth0 parent 1: classid 1:2 htb rate 10kbps ceil 100kbps
tc class add dev eth0 parent 1: classid 1:3 htb rate 60kbps ceil 100kbps

需要说明的是classid的作用域是在interface内的,即eth0或eth1都可以有同样的classid或handle id。

最后一步就是添加过滤规则,将特定的包放到指定的qdisc队列中,下面的flowid实际上就是classid。

tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 1.2.3.4 match ip dport 80 0xffff flowid 1:10
tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 1.2.3.4 flowid 1:11


最后,可以给叶子节点的class指定qdisc,默认是pfifo,也可以用netem设置时延的丢包等。

tc qdisc add dev eth0 parent 1:10 handle 20: pfifo limit 5
tc qdisc add dev eth0 parent 1:11 handle 30: pfifo limit 5
tc qdisc add dev eth0 parent 1:12 handle 40: sfq perturb 10


使用tc命令时,最好是将这些命令都写入到bash文件中,例子如下:

#############################################################################
#!/bin/bash
set -v
# type your commands here


tc qdisc del dev eth0 root  --- deletes all tc configuration for eth0

# creates starting point for configuration on eth0 (and directs all unclasified trafic to class 5) optional
tc qdisc add dev eth0 root handle 2 htb default 5

# creates new class 8 which belongs to root 2
tc class add dev eth0 parent 2: classid 2:8 htb rate 135Kbit ceil 500Kbit prio 2

# attach the shaper itself to the class 8 if you will not use this fifo shaper will be used by default
tc qdisc add dev eth0 parent 2:8 sfq

# in the root place check if packet destination is 1.3 and then direct it to class 8
tc filter add dev eth0 parent 2: protocol  u32 match ip dst 192.168.1.3 classid 2:8
#############################################################################

2012年2月16日星期四

tc-tbf限速

token bucket的概念比较简单,但是设置的时候有些参数需要说明一下。


 原理:token会被定期的注入到桶中,如果有token就能发数据,这里token对应的单位是字节而非包个数。桶的大小决定了突发的数据量,当桶很大时,可能会造成瞬间的突发流量,为了限制,可以使用peakrate参数。peakrate的实现本质上就是另外一个token bucket,只是桶比较小(通常只允许一个包),不允许突发的流量。因为是在每个tick到来时注入token的,对于HZ=100的情况,那每秒钟就有100个tick,如果每个tick注入一个包,并假设包大小为1000bytes,那么每秒钟的最高速率peakrate就是100*1000bytes/s = 100KB/s ≈ 1mbit/s。当然,这个是最理想的情况,基本上没有burst(可以达到更高的速率,但会带来一些burst。


 参数

limit - 除了桶之外,还有一个buffer,桶放token,buffer放数据,如果token不够用,数据就缓存在buffer中,这个limit就是这个buffer的大小。

latency - 允许的最大时延,数据被缓存就会造成时延的增大,latency * min(rate, peakrate) = limit,limit和latency不能同时设置。

rate - token注入的速率,也可以认为是带宽限制。

burst/buffer/maxburst - 桶的容量(字节数),如果限速越高,需要设置的burst就越大,因为tick的精度有限制。比如在intel机器上,如果要设置10mbit/s的限速,每秒100个tick(HZ=100),每个tick需要的token就是10mbit/100=100000bit=10KByte,这个就是桶的大小。这里还可以指定cell,cell和内部实现相关,基本上不用去考虑设置。

mpu - minium packet usage,每个包不管大小多大,都需要消耗token(payload为0,但还有包头或Padding),这个值指定了一个包需要消耗的最小token量(字节),默认为0。

peakrate - 和rate一样,只是用于第二个桶(peakrate桶),intel机器最大理想值为1mbit/s, Alpha机器最大理想值10mbit/s,即默认一个包的突发流量。一般不用设置。如果需要毫秒级别的控制(burst不能过大)则需要调小这个值。注意这里peakrate的是必须要比rate大的(如果设置peakrate的话)。

mtu/minburst - 只有peakrate设置了才有效,设置peakrate桶的大小。理想的情况是设置成接口的MTU。这个值设置大会带来burst,一般不用去设置。

参考链接:http://linux.die.net/man/8/tc-tbf

2012年2月2日星期四

第六感开源了

期待已久的第六感开源了,准备开始跟踪这个项目的进展。 这个得准备些硬件。 1. 摄像头,用来捕捉用户的场景,并交给移动设备来处理。这里的场景包括: - 捕捉用户手势和动作。 - 捕捉用户前面的场景和用户交互的物体。 - 当用户做出相框动作就拍照。 - 捕捉投影仪的用户界面,用来对投影仪进行调整。 2. 投影仪 投影仪通过向平面,墙或其他的物体上投射数字信息和用户界面,为用户提供操作界面。移动设备用来提供内容给投影仪。投影仪使用可充电的电池。 - 投影应用程序的用户界面。 - 为用户正在交互的物体提供提供实时的基于互联网的信息。 3. 镜子 镜子用来反射投影仪的光,便于投射到指定的墙面或物体表面。可以手动调整镜子角度和投影仪的位置。比如需要投射到地面上而不是面前的物体上。镜子用来改变投影仪的空间限制。 4. 麦克风 麦克风是可选设备,当需要将纸作为计算机界面时才需要,这时需要将麦克风夹在纸上,这样麦克风就能捕获用户触摸纸的声音信号,通过结合声音信号和用户手指的移动,系统就能够识别用户触摸纸的事件,即声音信号提供时间信息,而摄像头来追踪位置信息(什么时候在纸上划过)。 5. 移动计算设备 摄像头,投影仪和麦克风都连接在移动计算设备上(无线或有线连接),并且计算机要能够上网。当前只支持windows系统。这些设备可以通过乐高绳连接在一起。 另外为了便于追踪动作,可以在手指上带上彩色的小帽子,不同颜色的排列组合或移动都可以对应到不同的姿势,便于用户程序作出不同的反应。 软件使用: 1.First of all you need Visual Studios and direct x installed.... (I am using Visual studios ultimate 2010)... 2.Then u need to copy the files from wuw_v0.1.zip to any location on your computer. 3.Click on WUW01.sln (which is present in the folder "CODE") then click on F5 to debug it. 4.If you debug it successfully...a black screen appears with a little square box on the right just hover your mouse around it and you will find some options like Camera,Tokens,Apps...(Internet connection is required ) 5.Click on Tokens,(This is where you need to add your markers) 6.Then click on new marker,you will find that the screen starts blinking and after 4 secs it stops with a still picture.Now add the colour markers.(You need Four markers) 7.After adding,square boxes appears to move on your four colour markers ,then save those four markers. 8.And now test different apps like draw,Jeff Han,etc no need to do so much of visual basic debugging etc...... just go to the property of "\code\WUW01\bin\Debug\WUW01.exe" and change the compatibility to windows 98 and it will run fine without visual basic and all the long-cut process 参考链接: http://sixthsensewuw.blogspot.com/2012/01/how-to-configure-software-and-add.html 后面接着再看看源代码吧。