RailsConf 2015

Speed Science

by Richard Schneeman

In the session titled "Speed Science," Richard Schneeman discusses strategies for enhancing application performance through scientific methods. He emphasizes the importance of identifying and reproducing performance issues to address them effectively. The talk takes the audience through several key themes and practical examples to illustrate how minor adjustments can lead to substantial improvements.

Key Points Discussed:
- Understanding Bottlenecks: The first step in optimizing application speed is recognizing the bottlenecks in the system. Schneeman recommends utilizing Application Performance Monitoring (APM) tools to detect these performance issues accurately.

  • Utilizing Resources: By leveraging available resources such as increased CPU power and RAM, developers can create more efficient applications. For instance, using AWS instances with large memory allocations can facilitate faster processing through concurrent execution.

  • Real-World Case Studies: Schneeman shares a real-world example where an application managing large files experienced latency. He highlights how the performance could be improved by examining the types of I/O operations involved, where he discovered that disk I/O issues were the actual bottleneck, rather than CPU constraints.

  • Concurrency and Optimization: Experimenting with multi-threading proved beneficial, although he warned that adding too many threads could lead to diminishing returns. Increasing the concurrency of requests had a dramatic positive effect on the application's throughput.

  • Memory Management in Ruby: As Ruby is a garbage-collected language, understanding memory management is vital for performance tuning. Schneeman discusses the need to minimize unnecessary memory allocation and optimize low-level processes.

  • Systematic Approach: The talk stresses a systematic, scientific approach to testing and optimization. By focusing on benchmarks and performance metrics, developers can better understand the root causes of slowdown and apply appropriate optimizations.

In conclusion, Schneeman encourages developers to dedicate time to performance testing and optimization. By adopting a scientific mindset, one can diagnose and resolve slowness effectively to ensure applications operate in the optimal "fast lane."

00:00:11.309 Alright, so let's talk about making our applications faster and more efficient. This is something that I really care about, especially in my daily work. The interesting part is if we can reproduce a performance issue, we can squash it effectively. I want to engage the audience a bit here—does anyone know what shape this is? I hate to tell you, but this is actually a square. It’s known as a space player and is used for creating glass panels and making investments in square edges.
00:00:52.300 In this talk, we'll explore how small changes can lead to significant real-world performance gains. We are going to trade CPU and RAM resources for improved speed, similar to how we can restrict our online resources to improve efficiency. So, how do we make things faster? First, we need to identify the bottlenecks in our systems.
00:01:08.680 I recommend checking out APM tools if you don't already have one. For those of you who don't know me, my name is Richard Schneeman and I’m a huge fan of Ruby. As a famous saying goes, "If you love something, why don't you marry it?" So, I'm excited to introduce you to my favorite programming language, Ruby.
00:01:29.620 Let’s dive into a real-world application I worked on that had some performance issues. The application was handling large files, leading to considerable latency. What I needed to understand was how to optimize this application using the available resources effectively. I remembered we have tools at our disposal that allow us to leverage more CPU power and RAM. For example, a PM instance on AWS offers up to 16 GB of RAM which is fantastic for improving processing speed.
00:02:32.300 With these resources, we can run multiple threads, thus increasing our CPU load. I decided to experiment, focusing on whether adding more threads would yield better performance. However, sometimes, the results were counterintuitive, and I learned that sheer volume alone (in that case, 30 threads) wasn’t always better.
00:03:01.500 After running some tests, I discovered that while we weren’t CPU-bound, we had significant I/O issues. This led me to explore the types of I/O involved—network and disk operations. My first hypothesis was that our networking was the bottleneck. However, my tests indicated that it wasn’t; we were actually facing problems with disk I/O.
00:03:50.500 I experimented with various libraries to figure out how to improve this, including switching to a more efficient network library to handle requests. This is essential for performance tuning in Ruby, given that Ruby is a garbage-collected language, meaning its memory management is crucial for achieving speed.
00:04:54.300 After some iterations and adjustments, I found that increasing the concurrency of my requests dramatically improved the throughput of our application. The moral of this story is that sometimes, increased optimization heavily relies on correctly identifying which parts of your application are slowing you down.
00:05:36.300 This also involves recognizing and fixing low-level issues like unnecessary memory allocation. Whether we were trapped in a bottleneck by excessive threads or memory usage, it was evident that we need a systematic scientific approach to testing and optimizing.
00:06:39.600 In conclusion, I’ve learned that it’s essential to reproduce slowness as it helps identify bugs. The focus on benchmarks and evaluating performance metrics is crucial in figuring out the issues at hand. Overall, remember to take the time to fine-tune your applications, keeping performance in mind.
00:06:59.800 As a final thought, I encourage everyone here to embrace the fast lane of application development. Put effort into benchmarks and performance testing as they can provide insights into your application. Thank you for attending this session!