Cloud applications running in private data centers or public clouds are critical to every aspect of modern society, from entertainment to healthcare to financial services. The rapid growth of cloud applications is because organizations extensively leverage the general-purpose services offered by cloud platforms. Examples are general-purpose storage services such as AWS S3 [4]. These general-purpose services promise to provide high-performance and low-cost data analysis, elastic and scalable resources, and robust and reliable computations. Yet, cloud applications confront challenges to achieving these promises for several reasons: the exponential growth of data, the network limitations, the overhead of accessing the remote storage service, and the scarcity of complete information to make optimized decisions at different layers of the applications.This dissertation focuses on proposing systems to address the challenges mentioned above.We describe two systems that expand the general-purpose service APIs to exchange information critical to optimizing decisions. We also introduce components and algorithms that interpret the exchanged information and make optimized decisions.First, we describe Kariz to address the challenge of providing high-performance and scalable analytic applications with disaggregated storage-compute deployments. Kariz targets cloud applications that leverage general-purpose services such as analytical frameworks and object storage services. Kariz introduces a distributed caching system that extends the general-purpose object storage service and caches and prefetches input data accessed by the analytical framework. It extends the analytic framework APIs to exchange job dependency graphs (DAGs) and scheduling information with the cache, makes I/O scheduling decisions according to the scheduling information, estimates the run-time improvements, and predicts bandwidth to object storage service. Kariz integrates a cross-DAG scheduler and prefers pre-fetching input data shared by multiple DAGs. To build and evaluate Kariz, we characterize the job dependency graphs(DAGs) generated by analytic frameworks in a workload from in-production clusters.Then, we describe the elements of Kariz: a straggler-resistant partial cache system, a cache controller that run alongside the analytic frameworks-i.e. Spark and Pig-, and two graph-aware caching and pre-fetching algorithm for optimizing the caching of individual queries and three policies for optimizing across queries from, potentially, multiple different clusters. With an vi algorithm that fully exploits the rich information available from Kariz, we demonstrate major speedups (as much as 3×) for TPC-H and TPC-DS.Second, we describe Palette, to address the growing challenge of having computation close to data in general purpose Function-as-a-Service (FaaS) serverless computing. FaaS platforms enable a simple programming model with almost unbounded elasticity, making them an exciting choice for most cloud applications. However, current FaaS platforms achieve this...