[{"data":1,"prerenderedAt":798},["ShallowReactive",2],{"docs-navigation":3,"docs-\u002Fdocs\u002Fcamera\u002Fperformance":146,"docs-\u002Fdocs\u002Fcamera\u002Fperformance-surround":793},[4],{"title":5,"path":6,"stem":7,"children":8},"Docs","\u002Fdocs","docs",[9,12,80,124],{"title":10,"path":6,"stem":11},"Overview","docs\u002Findex",{"title":13,"path":14,"stem":15,"children":16},"Camera app","\u002Fdocs\u002Fcamera","docs\u002F1.camera\u002Findex",[17,18,22,26,48,52,56,60,64,68,72,76],{"title":10,"path":14,"stem":15},{"title":19,"path":20,"stem":21},"Requirements","\u002Fdocs\u002Fcamera\u002Frequirements","docs\u002F1.camera\u002F01.requirements",{"title":23,"path":24,"stem":25},"Install","\u002Fdocs\u002Fcamera\u002Finstall","docs\u002F1.camera\u002F02.install",{"title":27,"path":28,"stem":29,"children":30},"Connections","\u002Fdocs\u002Fcamera\u002Fconnections","docs\u002F1.camera\u002F03.connections\u002Findex",[31,32,36,40,44],{"title":27,"path":28,"stem":29},{"title":33,"path":34,"stem":35},"Allen-Bradley","\u002Fdocs\u002Fcamera\u002Fconnections\u002Fallen-bradley","docs\u002F1.camera\u002F03.connections\u002F1.allen-bradley",{"title":37,"path":38,"stem":39},"ABB robot","\u002Fdocs\u002Fcamera\u002Fconnections\u002Fabb-robot","docs\u002F1.camera\u002F03.connections\u002F2.abb-robot",{"title":41,"path":42,"stem":43},"Camera events","\u002Fdocs\u002Fcamera\u002Fconnections\u002Fcamera-events","docs\u002F1.camera\u002F03.connections\u002F3.camera-events",{"title":45,"path":46,"stem":47},"Demo and diagnostics","\u002Fdocs\u002Fcamera\u002Fconnections\u002Fdemo-and-diagnostics","docs\u002F1.camera\u002F03.connections\u002F4.demo-and-diagnostics",{"title":49,"path":50,"stem":51},"Tags","\u002Fdocs\u002Fcamera\u002Ftags","docs\u002F1.camera\u002F04.tags",{"title":53,"path":54,"stem":55},"Overlay","\u002Fdocs\u002Fcamera\u002Foverlay","docs\u002F1.camera\u002F05.overlay",{"title":57,"path":58,"stem":59},"History and charts","\u002Fdocs\u002Fcamera\u002Fhistory-and-charts","docs\u002F1.camera\u002F06.history-and-charts",{"title":61,"path":62,"stem":63},"DataBorder","\u002Fdocs\u002Fcamera\u002Fdataborder","docs\u002F1.camera\u002F07.databorder",{"title":65,"path":66,"stem":67},"Recording","\u002Fdocs\u002Fcamera\u002Frecording","docs\u002F1.camera\u002F08.recording",{"title":69,"path":70,"stem":71},"Performance","\u002Fdocs\u002Fcamera\u002Fperformance","docs\u002F1.camera\u002F09.performance",{"title":73,"path":74,"stem":75},"Status and troubleshooting","\u002Fdocs\u002Fcamera\u002Fstatus-and-troubleshooting","docs\u002F1.camera\u002F10.status-and-troubleshooting",{"title":77,"path":78,"stem":79},"Export and import","\u002Fdocs\u002Fcamera\u002Fexport-import","docs\u002F1.camera\u002F11.export-import",{"title":81,"path":82,"stem":83,"children":84},"Decoder","\u002Fdocs\u002Fdecoder","docs\u002F2.decoder\u002Findex",[85,86,89,93,96,100,104,108,112,116,120],{"title":10,"path":82,"stem":83},{"title":23,"path":87,"stem":88},"\u002Fdocs\u002Fdecoder\u002Finstall","docs\u002F2.decoder\u002F01.install",{"title":90,"path":91,"stem":92},"Clips","\u002Fdocs\u002Fdecoder\u002Fopen-clips","docs\u002F2.decoder\u002F02.open-clips",{"title":65,"path":94,"stem":95},"\u002Fdocs\u002Fdecoder\u002Frecord","docs\u002F2.decoder\u002F03.record",{"title":97,"path":98,"stem":99},"Live","\u002Fdocs\u002Fdecoder\u002Flive","docs\u002F2.decoder\u002F04.live",{"title":101,"path":102,"stem":103},"Timeline","\u002Fdocs\u002Fdecoder\u002Ftimeline","docs\u002F2.decoder\u002F05.timeline",{"title":105,"path":106,"stem":107},"Decoded data","\u002Fdocs\u002Fdecoder\u002Fdecoded-data","docs\u002F2.decoder\u002F06.decoded-data",{"title":109,"path":110,"stem":111},"Signal view","\u002Fdocs\u002Fdecoder\u002Fsignal-view","docs\u002F2.decoder\u002F07.signal-view",{"title":113,"path":114,"stem":115},"Extracting clips","\u002Fdocs\u002Fdecoder\u002Fclips","docs\u002F2.decoder\u002F08.clips",{"title":117,"path":118,"stem":119},"Verification","\u002Fdocs\u002Fdecoder\u002Fverify","docs\u002F2.decoder\u002F09.verify",{"title":121,"path":122,"stem":123},"Troubleshooting","\u002Fdocs\u002Fdecoder\u002Ftroubleshooting","docs\u002F2.decoder\u002F10.troubleshooting",{"title":125,"path":126,"stem":127,"children":128,"page":145},"Reference","\u002Fdocs\u002Freference","docs\u002F3.reference",[129,133,137,141],{"title":130,"path":131,"stem":132},"Configuration settings","\u002Fdocs\u002Freference\u002Fconfiguration","docs\u002F3.reference\u002F1.configuration",{"title":134,"path":135,"stem":136},"Compatibility","\u002Fdocs\u002Freference\u002Fcompatibility","docs\u002F3.reference\u002F2.compatibility",{"title":138,"path":139,"stem":140},"Release notes","\u002Fdocs\u002Freference\u002Frelease-notes","docs\u002F3.reference\u002F3.release-notes",{"title":142,"path":143,"stem":144},"Glossary","\u002Fdocs\u002Freference\u002Fglossary","docs\u002F3.reference\u002F4.glossary",false,{"id":147,"title":69,"body":148,"description":786,"extension":787,"meta":788,"navigation":789,"path":70,"seo":790,"source":791,"stem":71,"__hash__":792},"docs\u002Fdocs\u002F1.camera\u002F09.performance.md",{"type":149,"value":150,"toc":775},"minimark",[151,155,160,167,173,176,192,198,268,271,290,294,301,436,443,447,450,453,515,526,529,557,564,570,574,577,625,632,637,640,643,647,650,681,688,702,710,714,717,766],[152,153,154],"p",{},"RAVidEn shares the camera's processor with the video pipeline. Most configurations leave plenty of headroom. This page covers how to watch the load, what raises it, and what to change.",[156,157,159],"h2",{"id":158},"app-health","App health",[152,161,162,163,166],{},"Open ",[164,165,159],"strong",{}," from the navigation bar. The figures are sampled on the camera, so the panel takes a moment to fill in.",[168,169],"shot",{"alt":170,"caption":171,"name":172},"The App health panel: CPU, memory, uptime and overlay tiles, the CPU by subsystem table, and the overlay pipeline, PLC comms and thread sections.","App health on a camera with two overlaid streams and a DataBorder at 10 fps.","camera-app-health",[152,174,175],{},"The two processor figures at the top use different denominators.",[177,178,179,186],"ul",{},[180,181,182,185],"li",{},[164,183,184],{},"App CPU"," is the total for all of RAVidEn's threads, as a percentage of one processor core.",[180,187,188,191],{},[164,189,190],{},"Camera CPU"," is every process on the camera, including the video pipeline itself, as a percentage of all cores.",[152,193,194,197],{},[164,195,196],{},"CPU by subsystem"," divides RAVidEn's own time.",[199,200,201,214],"table",{},[202,203,204],"thead",{},[205,206,207,211],"tr",{},[208,209,210],"th",{},"Row",[208,212,213],{},"Covers",[215,216,217,228,238,248,258],"tbody",{},[205,218,219,225],{},[220,221,222],"td",{},[164,223,224],{},"Overlay render",[220,226,227],{},"Drawing the elements, stamping the DataBorder ring, and copying each finished frame to the video pipeline.",[205,229,230,235],{},[220,231,232],{},[164,233,234],{},"PLC comms",[220,236,237],{},"The poll thread for each connection, and the evaluation of derived states.",[205,239,240,245],{},[220,241,242],{},[164,243,244],{},"Web API",[220,246,247],{},"Serving the interface you are looking at.",[205,249,250,255],{},[220,251,252],{},[164,253,254],{},"History",[220,256,257],{},"The half-hourly save to flash and the sweeper that retires tags no longer in use.",[205,259,260,265],{},[220,261,262],{},[164,263,264],{},"Other",[220,266,267],{},"The tag library's internals and the shared worker pools.",[152,269,270],{},"Three sections below the table give the detail.",[177,272,273,279,284],{},[180,274,275,278],{},[164,276,277],{},"Overlay pipeline"," shows the redraws per second across all streams, the DataBorder updates per second, and the average time spent rendering each frame and then copying it. The copy is usually the larger of the two.",[180,280,281,283],{},[164,282,234],{}," shows the read and error rates against the controllers.",[180,285,286,289],{},[164,287,288],{},"Threads"," breaks the same processor time down to individual threads.",[156,291,293],{"id":292},"performance-tags","Performance tags",[152,295,296,297,300],{},"To follow performance over time, add a connection with the ",[164,298,299],{},"Diagnostics"," source and add tags from it.",[199,302,303,313],{},[202,304,305],{},[205,306,307,310],{},[208,308,309],{},"Tag",[208,311,312],{},"Reports",[215,314,315,326,336,346,356,366,376,386,396,406,416,426],{},[205,316,317,323],{},[220,318,319],{},[320,321,322],"code",{},"cpu.total",[220,324,325],{},"Camera processor use, all cores",[205,327,328,333],{},[220,329,330],{},[320,331,332],{},"cpu.app",[220,334,335],{},"RAVidEn's own processor use",[205,337,338,343],{},[220,339,340],{},[320,341,342],{},"cpu.thread.main",[220,344,345],{},"The overlay render share",[205,347,348,353],{},[220,349,350],{},[320,351,352],{},"cpu.thread.comms",[220,354,355],{},"The polling share",[205,357,358,363],{},[220,359,360],{},[320,361,362],{},"mem.app.rss.mb",[220,364,365],{},"RAVidEn's memory",[205,367,368,373],{},[220,369,370],{},[320,371,372],{},"load.1",[220,374,375],{},"One-minute load average",[205,377,378,383],{},[220,379,380],{},[320,381,382],{},"temp.c",[220,384,385],{},"Processor temperature, where the camera exposes it",[205,387,388,393],{},[220,389,390],{},[320,391,392],{},"overlay.redraws",[220,394,395],{},"Overlay frames submitted, running total",[205,397,398,403],{},[220,399,400],{},[320,401,402],{},"overlay.render.ms",[220,404,405],{},"Duration of the last render",[205,407,408,413],{},[220,409,410],{},[320,411,412],{},"ring.frames",[220,414,415],{},"DataBorder updates encoded, running total",[205,417,418,423],{},[220,419,420],{},[320,421,422],{},"comms.reads",[220,424,425],{},"Controller reads, running total",[205,427,428,433],{},[220,429,430],{},[320,431,432],{},"comms.errors",[220,434,435],{},"Failed reads, running total",[152,437,438,439,442],{},"These behave like any other tag: chart them, put them on the overlay, or carry them in the DataBorder. See ",[440,441,57],"a",{"href":58},".",[156,444,446],{"id":445},"redraw-cost","Redraw cost",[152,448,449],{},"The overlay redraws when a displayed value changes. A value whose text changes constantly, such as a reading shown to three decimals, redraws continuously up to the rate cap. Rounding it to fewer decimals removes that work.",[152,451,452],{},"Each element redraws only when its own inputs change, and the cost depends on the element. Read these figures as magnitudes; an element's own settings move them.",[199,454,455,465],{},[202,456,457],{},[205,458,459,462],{},[208,460,461],{},"Element",[208,463,464],{},"Cost per redraw",[215,466,467,475,483,491,499,507],{},[205,468,469,472],{},[220,470,471],{},"Tick chart",[220,473,474],{},"About 4.5 ms",[205,476,477,480],{},[220,478,479],{},"Robot panel, robot figure",[220,481,482],{},"About 2 ms",[205,484,485,488],{},[220,486,487],{},"State strip",[220,489,490],{},"1 to 2.5 ms",[205,492,493,496],{},[220,494,495],{},"Tag table",[220,497,498],{},"About 0.8 ms",[205,500,501,504],{},[220,502,503],{},"State tile",[220,505,506],{},"About 0.6 ms",[205,508,509,512],{},[220,510,511],{},"Static text, image, watermark",[220,513,514],{},"Drawn once and then cached",[152,516,517,518,521,522,525],{},"Copying each finished frame into the video pipeline costs about 3 ms per stream, regardless of how many elements are drawn, and is usually larger than the render itself. The ",[164,519,520],{},"Render \u002F frame"," and ",[164,523,524],{},"Copy+submit \u002F frame"," figures in App health show the split for your configuration.",[152,527,528],{},"Three costs have nothing to do with tag changes.",[177,530,531,537,547],{},[180,532,533,536],{},[164,534,535],{},"Charts redraw on a timer."," Elements that draw a window ending now refresh about once a minute even when no value changes. The state tile refreshes every ten seconds. The refreshes are staggered.",[180,538,539,542,543,546],{},[164,540,541],{},"Every stream costs a copy."," Streams of the same size share one rendered picture, but each copies a full frame into the video pipeline on every submit. The ",[164,544,545],{},"Overlays"," tile counts the streams carrying an overlay.",[180,548,549,552,553,556],{},[164,550,551],{},"Motion easing bypasses the element cache."," The ",[164,554,555],{},"Motion"," setting under Settings forces a redraw five times a second while a gauge or bar value is moving. It is off by default.",[152,558,559,560,563],{},"The DataBorder adds a small fixed cost per update for stamping the ring. ",[164,561,562],{},"Full history in stream"," is the one option that works continuously, because it compresses the stored history and cycles it through the DataBorder's spare capacity.",[152,565,566,567,569],{},"Polling is the ",[164,568,234],{}," row. It depends on the poll interval of each connection and on how many tags are in use. Only tags that something uses are polled.",[156,571,573],{"id":572},"refresh-rates","Refresh rates",[152,575,576],{},"Two settings govern how often the work happens. Both are rounded to the camera's compositing tick, which runs ten times a second.",[199,578,579,595],{},[202,580,581],{},[205,582,583,586,589,592],{},[208,584,585],{},"Setting",[208,587,588],{},"Page",[208,590,591],{},"Default",[208,593,594],{},"Range",[215,596,597,611],{},[205,598,599,602,605,608],{},[220,600,601],{},"Max redraw rate",[220,603,604],{},"Settings",[220,606,607],{},"5 fps",[220,609,610],{},"0.5 to 10",[205,612,613,616,619,622],{},[220,614,615],{},"DataBorder update rate",[220,617,618],{},"DataBorder, under Advanced",[220,620,621],{},"10 fps",[220,623,624],{},"1 to 10",[152,626,627,628,631],{},"The ",[164,629,630],{},"max redraw rate"," caps the redraws that changing values cause. A quiet overlay redraws far less often than the cap. Lowering it is the simplest way to cut drawing work.",[152,633,627,634,636],{},[164,635,615],{}," sets how often a new payload is generated. Every stream carrying the DataBorder carries the same payload.",[152,638,639],{},"A stream carrying the DataBorder is submitted on every update whether or not a displayed value changed, so on that stream the update rate sets how often the frame is copied. Lowering the redraw cap saves the drawing but not the copying. Lowering the update rate saves both, but the DataBorder then takes longer to deliver names, history and signatures to a decoder.",[152,641,642],{},"The update rate is independent of the video frame rate. At 25 or 30 frames per second with 10 updates per second, each update is carried by two or three consecutive frames. This repetition is what lets the DataBorder survive compression and dropped frames.",[156,644,646],{"id":645},"signs-of-overload","Signs of overload",[152,648,649],{},"On the camera, in App health:",[177,651,652,658,672],{},[180,653,654,657],{},[164,655,656],{},"DataBorder updates per second below the expected figure."," The figure counts one update per 1920 × 1080 stream, so two streams at 10 fps should show 20. With the DataBorder off, watch the redraws per second instead.",[180,659,660,663,664,521,666,668,669,671],{},[164,661,662],{},"Render and copy time filling the tick."," The camera has 100 ms per tick to render once and copy a frame for every stream. Add ",[164,665,520],{},[164,667,524],{}," and multiply by ",[164,670,545],{},". A healthy configuration uses a small part of it.",[180,673,674,677,678,680],{},[164,675,676],{},"App CPU well above its usual figure."," Chart ",[320,679,332],{}," from the diagnostics source to have a baseline to compare against.",[152,682,683,684,687],{},"In a recording, in the decoder's ",[440,685,686],{"href":110},"signal view",":",[177,689,690,696],{},[180,691,692,695],{},[164,693,694],{},"An update held about twice as long as usual",", marked in yellow in the updates lane. The camera skipped a refresh.",[180,697,698,701],{},[164,699,700],{},"A sequence gap attributed to the camera"," rather than to dropped frames. That sequence never reached any frame.",[152,703,704,705,707,708,442],{},"These are not decoding failures. Unrecoverable frames, corrections gathered in one stretch of the ring, and falling margin are picture problems caused by bitrate, compression, or something drawn over the ring. Reducing RAVidEn's load does not fix them. See ",[440,706,65],{"href":66}," and the ",[440,709,686],{"href":110},[156,711,713],{"id":712},"reducing-the-load","Reducing the load",[152,715,716],{},"Work down this list and check App health after each step.",[718,719,720,726,736,742,748,754,760],"ol",{},[180,721,722,725],{},[164,723,724],{},"Reduce the number of streams that carry an overlay."," Each one copies a full frame on every submit, which is the largest single cost in the pipeline.",[180,727,728,731,732,735],{},[164,729,730],{},"Lower the DataBorder update rate."," On a stream carrying the DataBorder this sets how often the frame is copied. See ",[440,733,573],{"href":734},"#refresh-rates"," for the trade-off.",[180,737,738,741],{},[164,739,740],{},"Round the values you display."," A reading shown to fewer decimals redraws far less often.",[180,743,744,747],{},[164,745,746],{},"Lower the max redraw rate"," under Settings. This saves drawing, and on streams without the DataBorder it saves the copy as well.",[180,749,750,753],{},[164,751,752],{},"Turn off motion easing"," if it is on.",[180,755,756,759],{},[164,757,758],{},"Use fewer chart elements."," Charts cost the most per redraw and refresh on their own clock.",[180,761,762,765],{},[164,763,764],{},"Poll less often."," Most displays do not need a reading more than once a second. Polling is usually a small share, so check the subsystem table first.",[152,767,768,769,772,773,442],{},"If the camera still cannot keep up, ",[164,770,771],{},"Settings → Config file → Download diagnostics"," captures the App health counters along with the configuration and the log. See ",[440,774,73],{"href":74},{"title":776,"searchDepth":777,"depth":777,"links":778},"",3,[779,781,782,783,784,785],{"id":158,"depth":780,"text":159},2,{"id":292,"depth":780,"text":293},{"id":445,"depth":780,"text":446},{"id":572,"depth":780,"text":573},{"id":645,"depth":780,"text":646},{"id":712,"depth":780,"text":713},"Reading App health and reducing the camera's load.","md",{},true,{"title":69,"description":786},null,"JUnBiP2vpPSy1wvZDofbT75LOyhFnXHdElnYA1Z3amM",[794,796],{"title":65,"path":66,"stem":67,"description":795,"children":-1},"Robust recording recommendations.",{"title":73,"path":74,"stem":75,"description":797,"children":-1},"How to diagnose and troubleshoot issues.",1788953751520]