In this paper, a new I/O-aware load-balancing scheme is presented to improve overall performance of a distributed system with a general and practical workload including I/O activities. The proposed scheme dynamically detects I/O load imbalance on nodes of a distributed system and determines whether to migrate the I/O requests of some jobs from overloaded nodes to other less- or under-loaded nodes, depending on data migration cost and remote I/O access overhead. Besides balancing I/O load, the scheme judiciously takes into account both CPU and memory load sharing in distributed systems, thereby maintaining the same level of performance as the existing schemes when I/O load is low or well balanced. Results from a trace-driven simulation study show that, compared with the existing schemes that only consider CPU and memory, the proposed scheme reduces the mean slowdown by up to 54.5% (with an average of 39.9%). On the other hand, when compared to the existing approaches that only consider I/O, the proposed scheme reduces the mean slowdown by up to 57.2% (with an average of 31.6%). More importantly, the new scheme improves over a very recent algorithm found in the literature that considers all the three resources by up to 49.6% (with an average of up to 41.9%).