User:Rdoherty/Velocity notes
From MozillaWiki
Contents
Jiffy
- Can measure 0-100% of all page loads
- Measure anything
- Measure when page is useable
- Real/near time reporting
- No impact on page perf. (very little impact)
- Components
- jiffy.js
- apache config
- Perl & php
- database (oracle right now)
- Mark & measure
- Immediate or batch submits
- Default browser even measurements
- Firebug plugin
Measuring Performance
- Tools:
- Keynote KITE
- Coradiant Truesight + Web.I, Tealeaf, Jiffy
- Internal
- HP/Mercury SiteScope + BAC, Nagios,
- External synthetic monitoring
- keynote, gomez, webmetrics
- Network analysis
- wireshark, clearsight, ACE, NetQoS
- In depth
- Opnet Panorama, Introscope, Quest (DB),
- Load testing
- LoadRunner, Jmeter, ab
- Many drawbacks to testing tools. Some cause extra load, crash servers, not accurate.
- Hard to duplicate production systems
- Turning star rating from 50 images to 2 on Netflix actually degraded performance. Don't attach event handlers to everything, use containers.
Hotmail's Performance Tuning practices
- Performance should be core from the beginning
- Customers don't care what performance is
- Best performance gains are simplest of all
- Laws of physics
- Use less bytes
- HTML is faster (don't build UI with javascript)
- Asymmetric bandwidths can bottleneck upstream
- Max bandwidth is reliant on latency. 300ms latency == 300kb/s
- bring content closer to user
- minimize page weights
- Utilize closed feedback system
- Trim page weights
- Render more content on server side
- Trim image sizes
- Use cache control, expiration
- Optimize between inline & stand alone css & js
- Trim page weights (upstream)
- Trim cookie sizes
- Trim down # of redirects
- Don't set cookies at root path or domain
- Bandwidth efficiency
- multiple domains
- JIT downloading
- Control sequencing of downloading
Live Search
- New redesign with lots more assets
- Netn
- Inline css & js
High performance AJAX
slideshare.net/julien.lecomte/high-performance-ajax-applications
- Plan for performance from day 1
- Don't do anything until necessary
- Cheat: show and update before it's completed
- Keep UI responsive at all times
- Test performance using a setup similar to users' environment
- Profile code during development
- Automate profiling & performance testing
- Keep historical data
- Reduce total uncompressed code
- Close all tags
- Flush apache buffer early
- Don't wait for onload
- Post-load scripts
- Pre-load next page's assets
- Javascript
- reduce the amount of symbolic look-up (use var inside {}'s)
- stay away from with keyword
- cache results of expensive lookups
- Reduce prototype chain lookups
- Bind properties/functions to objects prototype constructor
- Don't use eval
- Pass anonymous functions to setTimeout and setInterval,not strings
- Optimize string concatenation
- Don't user regexp constructor
- chain long javascript processes using setTimeout
- primitive operations are better than function calls
- avoid for...in in performance critical sections
- Use innerhtml
- Use clonenode
- limit # of event handlers. use event delegation
- Limit reflows of document. Happens whenever anything happens in the dom
- Batch style changes
- Modify elements with display:none
- downshift your code: throttle frequent and expensive actions
- CSS
- use sprites
- don't use js for layout
- avoid expressions
- avoid IE filters
- AJAX
- don't user synchronous xhr
- handle timeouts
- update UI when request is sent
- lock smallest possible parts of ui
- use json
- push, don't poll
Cadillac or Nascar?
- Evaluating 1 app written in PHP, JavaEE and RoR. Social Event calendar
- Use MySQL 5.1
- Apache
- do not load modules you don't use
- PHP
- increase realpath_cache_size if you have a lot of files
- Memcache
- use 4 processes
- don't run on server that is also doing web stuff
- Mysql
- tune queries
- joins over subqueries
- use limits
- separate read/write dbs
Fiddler
- Can simulate modem speeds
AOL page tester
- webpagetest.org
Even faster websites
- Very little time is spent retrieving html
- New rules
- split initial payload
- load scripts without blocking
- don't scatter inline scripts
- Doloto (MS testing utility, not open or available :( )
- Parallel script loading
- XHR eval. Fetch js as xmlhttprequest, eval it.
- Must be on same domain as main page
- Must refactor script
- XHR injection
- appending javascript from xhr request to doc head
- script in iframe
- script must target parent page
- unknown performance penalty
- Script dom element
- create script element, set source, append to head of document
- no need to refactor
- Script defer
- <script defer
- only works in IE
- no refactoring
- Document.write script tag
- only works in IE
- only adds parallelization for scripts
- all document.writes must be in same script block
- Browser busy indicators
- Necessary if scripts will perform an action the user is waiting for
- Ensure/avoid ordered execution
- Inline scripts block as well
- Use setTimeout to remove blockig behaviour (>250ms for FF)
- Firefox blocks parallel downloads when downloading stylesheets
- IE doesn't, except when stylesheet is followed by inline script
- Move inline scripts above everything
Performance Plumbing
- ANYCAST
- net address and routing scheme used for proximity
- also useful for load absorption
Capacity Management for Web Operations
- Book coming out soon.
- Capacity != Performance
- Forget about performance
- Measure what you have right now
- Automate stuff
- system imager
- ganglia
- Good measurement tools
- record and store
- metrics in/out
- custom metrics
- easily compare
- lightweight
- Ganglia!
- Ceilings
- most amount of work a box will do before failing/degrading
- Forget benchmarking
- use production data
- use live production loads (divert % of traffic to new features/systems, etc)
- pull boxes out of rotation, see where others fall over
- Find your 'safe' ceiling, what you are comfortable with
- Forecasting
- Example with webservers
- Graph your utilization, find trends, extrapolate
- Calculate your ceiling based on # of machines you have how much traffic they can handle
- Automate your forecasting
- Calculate 'days remaining' until you have to add servers
- fityk.sf.net * graphing tool
- Storage consumption
- Create high & low water marks
- alerts if you go below or above limits
- Create dashboard that shows your % utilization and days left on your current architecture
- Scale diagonally
- add more horsepower per box
- you can use less machines
- less power
- less racks
- 3.4TB/day consumed on Flickr
- 2nd order effects
- Add memcache, decreases DB load, increases web server load
- Add web servers, increases DB load
- Puppet
- DSH
- distributed shell
- Disable heavy features via configuration flags
- Better to have something up than nothing
- Host your outage blog/status/page in a different datacenter & domain
- Tell your user what's going on
- Add ability to turn dynamic content into static content
- Some Y! properties have ability to turn entire site into static content (big red button)
- Developers need to think like sys admins and have access to same data & configuration
- Very verbose logging. who, what, when for pushes correlated with ganglia graphs
- Small pushes are better than large pushes every 2 weeks
Squid and Varnish
- Squid sucks, Varnish is hella fast (more than 10x)
This is your site on Ads
- Nearly all ad networks use document.write, can't be loaded after page has loaded
- Ads don't gzip or minify. They load too much crap (beacons, js, image, etc)